加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
python_context.py 1.82 KB
一键复制 编辑 原始数据 按行查看 历史
xianhu 提交于 2017-01-04 18:18 . add python_context.py
# _*_ coding: utf-8 _*_
"""
python_context.py by xianhu
"""
import contextlib
# 自定义打开文件操作
class MyOpen(object):
def __init__(self, file_name):
"""初始化方法"""
self.file_name = file_name
self.file_handler = None
return
def __enter__(self):
"""enter方法,返回file_handler"""
print("enter:", self.file_name)
self.file_handler = open(self.file_name, "r")
return self.file_handler
def __exit__(self, exc_type, exc_val, exc_tb):
"""exit方法,关闭文件并返回True"""
print("exit:", exc_type, exc_val, exc_tb)
if self.file_handler:
self.file_handler.close()
return True
# 使用实例
with MyOpen("python_base.py") as file_in:
for line in file_in:
print(line)
raise ZeroDivisionError
# 代码块中主动引发一个除零异常,但整个程序不会引发异常
# 内置库contextlib的使用
@contextlib.contextmanager
def open_func(file_name):
# __enter__方法
print("open file:", file_name, "in __enter__")
file_handler = open(file_name, "r")
yield file_handler
# __exit__方法
print("close file:", file_name, "in __exit__")
file_handler.close()
return
# 使用实例
with open_func("python_base.py") as file_in:
for line in file_in:
print(line)
break
# 内置库contextlib的使用
class MyOpen2(object):
def __init__(self, file_name):
"""初始化方法"""
self.file_handler = open(file_name, "r")
return
def close(self):
"""关闭文件,会被自动调用"""
print("call close in MyOpen2")
if self.file_handler:
self.file_handler.close()
return
# 使用实例
with contextlib.closing(MyOpen2("python_base.py")) as file_in:
pass
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化