Python基础 常用内建模块

来源:互联网 发布:手机借款软件 编辑:程序博客网 时间:2024/05/23 18:41

回顾 with的语句

普通的读文件

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

whit语句的读文件

# 简易版读写方式,不用担心忘记closedef 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基础 常用内建模块 - contextlibfrom contextlib import contextmanagerclass 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基础 常用内建模块 - contextlibfrom contextlib import contextmanager# 我们希望在某段代码执行前后自动执行特定代码,也可以用@contextmanager实现@contextmanagerdef 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基础 常用内建模块 - contextlibfrom contextlib import contextmanager,closingfrom urllib.request import urlopen# closing让没有对象上下文,变成有对象上下文,从而使用 whith语句with closing(urlopen("https://www.python.org")) as page:    for line in page:        print(line)

具体原理

# closing 的原型如下     @contextmanagerdef easyClosing(thing)    try:        yield thing    finally:        thing.close()
原创粉丝点击