上下文管理器(try、with、 contextlib)

try

# try except finally
try:
    print("start")
    raise KeyError
    # IndexError
except KeyError as e:
    print("key error")
except IndexError:
    print("IndexError error,精确捕捉异常")
except:
    print("other error,异常了,但是以上都没有精确捕捉到")
    print("谨慎使用")
else:
    print("no error,没有异常会运行")
finally:
    print("有没有异常,都会运行")

"""
补充:
    如果try 里有return语句
    无论如何 都会返回finally中的return
    如果finally没有,就根绝正常的执行逻辑去返回。
"""

上下文管理器

import time
class Sample():
    def __enter__(self):
        print("enter")
        # 获取资源
        return self
    def __exit__(self,exc_type,exc_val,exc_tb):
        # 释放资源
        print("exit")
    def do_something(self):
        # 使用
        print("do something")
with Sample() as sample:
    time.sleep(1)
    sample.do_something()

contextlib上下文管理器

# 简化的上下文管理器

import contextlib
import time

@contextlib.contextmanager
def file_open(file_name):

    print("打开文件")
    """
    一个生成器
    yield之前, 相当于 __enter__
    """
    yield { }

    print("关闭文件")
    """
    yield 之后,相当于__exit__
    """

with file_open("1235.mp4") as sample:
    time.sleep(1)
    print("do someting")

猜你喜欢

转载自blog.csdn.net/sunt2018/article/details/86573788
今日推荐