python 装饰器:contextlib
admin
2023-07-23 14:22:35
0

上下文环境:

开始信息

     |

中间输出信息

     |

结束信息


上下文环境1:

#!/usr/bin/python
# -*- coding: utf-8 -*-

class Query(object):

    def __init__(self, name):
        self.name = name

    def __enter__(self):
        print('Begin')
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        if exc_type:
            print('Error')
        else:
            print('End')

    def query(self):
        print('Query info about %s...' % self.name)
        
with Query('Bob') as q:
    q.query()
    
    
Query('Bob').query()

运行结果:

Begin
Query info about Bob...
End
Query info about Bob...


上下文环境2:@contextmanager

from contextlib import contextmanager

class Query(object):

    def __init__(self, name):
        self.name = name

    def query(self):
        print('Query info about %s...' % self.name)

@contextmanager
def create_query(name):
    print('Begin')
    q = Query(name)
    yield q
    print('End')
    
with create_query('Bob') as q:
    q.query()

运行结果:

Begin
Query info about Bob...
End


上下文环境3:@contextmanager 再次简化

from contextlib import contextmanager

@contextmanager
def tag(name):
    print("<%s>" % name)
    yield
    print("" % name)

with tag("h2"):
    print("hello")
    print("world")

上述代码执行结果为:

hello world


没有上下文环境:@closing  通过closing()来把该对象变为上下文对象,例如,用with语句使用urlopen():

from contextlib import closing
from urllib.request import urlopen

with closing(urlopen('https://www.baidu.com')) as page:
    for line in page:
        print(line)

上述代码执行结果为:

b'\r\n'
b'\r\n'
b'\t\r\n'
b'\r\n'
b'\r\n'
b'\t\r\n'
b'\r\n'
b''


不懂怎么验证的closing

from contextlib import contextmanager

@contextmanager
def closing(thing):
    try:
        yield thing
    finally:
        thing.close()

上述代码执行结果为:



相关内容

热门资讯

他或成英国新首相,特朗普表态 英国首相斯塔默日前宣布辞职,他的继任者极有可能是前大曼彻斯特市长、议员伯纳姆。美国总统特朗普近来与斯...
人民日报钟声:急修“安保三文件... 急修“安保三文件”,暴露日本加速军事转轨的急躁姿态(钟声)《人民日报》(2026年06月25日 第 ...
小伙凌晨酒店按摩从房间坠亡,酒... 一名“00后”小伙与同事聚餐饮酒后,凌晨前往一酒店接受按摩,却从酒店房间坠楼身亡。据酒店相关负责人以...
内塔尼亚胡称只要其在任以军就不... △内塔尼亚胡(资料图)当地时间24日,以色列总理内塔尼亚胡在以色列地方政府联合会上发表讲话,谈及以军...
瑞士谈判核心诉求为何?议长会否... 美伊瑞士谈判刚刚结束,双方对谅解备忘录各执一词。我在伊朗外交部新闻发布会现场提问:从瑞士谈判到阿曼磋...
鲁比奥:美伊本月底将继续技术磋... △鲁比奥(资料图)24日多方消息显示,美国国务卿鲁比奥表示,美国和伊朗技术团队将于6月底在瑞士继续举...
芯联集成200亿项目落地:12... 快科技6月24日消息,芯联集成近日发布对外投资进展公告,公司与芯联先进集成电路制造(绍兴)有限公司(...
刷新海洋机器人融资纪录后,他以... 来源:滚动播报 (来源:上观新闻) 依托长三角科创产业沃土,国内海洋智能装备赛道跑出新锐力量。今天...
2026年省管企业“科技创新与... 为进一步提升国资国企科技创新管理水平,推动企业规范开展科技创新活动,强化实践运用能力,切实以高质量创...
智平方郭彦东:机器人大脑不应只... “下一代机器人大脑不应只是算力和数据的竞赛。” 6月23日,具身智能机器人公司智平方创始人兼CEO郭...