zoukankan      html  css  js  c++  java
  • 上下文管理

    1. try...except...finally
    import traceback
    def exe_try():
    try:
    print("code start")
    raise ImportError
    return 1

    except KeyError as e:
    print("keyerror")
    print(e)
    return 2
    except :
    print("error")
    print(traceback.format_exc())
    return 3
    finally:
    print("over")
    return 4

    print(exe_try())


    可以持续使用except 去捕获异常。finally:表示必须要去执行的地方,注意,当return放在try ... except。。。finally中的时候,程序肯定会取finally中的return的值,而且程序不管怎么样,都会去执行finally的程序。

    2. 上下文管理器---with

    __enter__ __exit__


    # 上下文管理器协议
    class Sample:
    def __enter__(self):
    print('enter')
    return self

    def __exit__(self, exc_type, exc_val, exc_tb):
    print('exit')

    def dosomething(self):
    print('do something')

    with Sample() as sample:
    print(sample)


    符合上下文管理协议,均可以使用with进行操作。
    处理流程:Sample()实例化的过程中,执行的是__enter__里面的语句,获取的值是__enter__的返回值,即可以理解为sample=self,在执行完with里面的语句的时候,执行的是__exit__里面的语句(不管里面是否有报错,都会去执行__exit__的语句),所以可以自我去实现很多上下文管理器,例如数据库的连接,django中事务的手动回滚等等一些需要关闭的操作


    3, contextlib简化上下文管理器---使用装饰器将生成器包装成上下文管理器


    import contextlib

    @contextlib.contextmanager# 使用装饰器将函数变成一个上下文管理器
    def file_open(file_name): #这个函数必须是一个生成器
    print('file open')# enter里面的逻辑
    yield {1:2}
    print('file end')#exit之后的逻辑

    with file_open('111.txt') as fh:
    print('file process')

  • 相关阅读:
    mysql的存储过程
    一份php高级工程师的面试题,我每天看一点点
    php的常用函数(持续更新)
    php 中文字符串截取
    php递归遍历文件目录
    ajax timeout 断网处理
    angular 刷新问题
    angular state中templateUrl 路径的模板
    angular请求传递不了数据
    截取字符串 substring substr slice
  • 原文地址:https://www.cnblogs.com/wenshu/p/12267098.html
Copyright © 2011-2022 走看看