Python基础 常用内建模块 - contextlib

回顾 with的语句

普通的读文件

# 读写文件的一般方式
def safeFun():
    try:
        f = open("路径", "r")
        r.read()
    finally:
        if f:
            f.close

whit语句的读文件

# 简易版读写方式,不用担心忘记close
def easySafeFun():
    with open("路径", "r") as f:
        f.read()

民间 with 语句

自定义 with 语句

# 让老百姓也能使用with的语句
class Query(object):

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

    # whit语句需要  
    def __enter__(self):
        print("enter")
        return self

    # whit语句需要
    def __exit__(self, exc_type, exc_value, traceback):
        if exc_type:
            print("Error")
        else:
            print("End")

    def query(self):
        print("查询信息为 %s" % (self.name))

官方 with 语句 - contextlib 模块

@contextmanager让我们通过编写generator来简化上下文管理。

运行示例

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Python基础 常用内建模块 - contextlib

from contextlib import contextmanager

class EasyQuery(object):

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

    def query(self):
        print("查询信息为 %s" % (self.name))

    # @contextmanager这个decorator接受一个generator,用yield语句把with ... as var把变量输出出去,然后,with语句就可以正常地工作了    
    @contextmanager
    def creat_query(name):
        print("霸气开始")
        q = EasyQuery(name)
        # 有yield关键字就表示该函数是generator函数了
        # 作为回报 print(b)写成 yield(b)
        # 遇到 yield 语句返回
        yield q
        print("霸气结束")

def easyQueryHaveWitchTest():
    with EasyQuery.creat_query("王大锤") as q:
        # 运行结果
        # 霸气开始
        # 查询信息为 王大锤
        # 霸气结束
        q.query()

easyQueryHaveWitchTest()

运行结果

D:\PythonProject\sustudy>python main.py
霸气开始
查询信息为 王大锤
霸气结束

@contextmanager

我们希望在某段代码执行前后自动执行特定代码,也可以用@contextmanager实现
运行示例

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Python基础 常用内建模块 - contextlib

from contextlib import contextmanager

# 我们希望在某段代码执行前后自动执行特定代码,也可以用@contextmanager实现
@contextmanager
def tag():
    print("----前----")
    yield
    print("----后----")

with tag():
    print("小美")
    print("大锤")

运行结果

D:\PythonProject\sustudy>python main.py
--------
小美
大锤
--------

代码的执行顺序是:
1. with语句首先执行yield之前的语句,因此打印出print(“—-前—-“);
2. yield调用会执行with语句内部的所有语句,因此打印出 print(“小美”) 和 print(“大锤”) ;
3. 最后执行yield之后的语句,打印出print(“—-后—-“)。

closing()语句

运行示例

closing 让没有对象上下文,变成有对象上下文,从而使用 whith语句

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Python基础 常用内建模块 - contextlib

from contextlib import contextmanager,closing
from urllib.request import urlopen

# closing让没有对象上下文,变成有对象上下文,从而使用 whith语句
with closing(urlopen("https://www.python.org")) as page:
    for line in page:
        print(line)

具体原理

# closing 的原型如下     
@contextmanager
def easyClosing(thing)
    try:
        yield thing
    finally:
        thing.close()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法迪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值