Python 中 __enter__ __exit__ 方法

字数 174阅读 1173
class A:
    def __enter__(self):
        return '%s is good' % self
    def __exit__(self, exc_type, exc_value, traceback):
        if exc_type == ZeroDivisionError:
            print(exc_value)
            print(traceback)
            return True
        elif exc_type == IndexError:
            print(exc_value, type(exc_value))
            print(traceback)
            return True

with A():
    a = []
    a[0]
# 输出
list index out of range <class 'IndexError'>
<traceback object at 0x10b1e9548>

__enter__

__enter__ 用于赋值给 as 后面的变量。不过 with 语句中 as 不是必须的。__enter__ 和 __exit__ 必须并用。

__exit__

用于捕获异常,它的返回值是一个 boolean 对象。除了 self 之外,必须传入另外三个参数,分别表示 exception 的类型,值(如 IndexError: list index out of range 中,冒号后面的部分就是值),以及 traceback。
返回 True 则表示这个异常被忽略。
返回 None, False 等则这个异常会抛出。
如果要忽略所有的异常可以这样写:

def __exit__(self, exc_type, exc_value, traceback):
    return True

经过测试, SyntaxError 是不能忽略的,其他已知的是可以的。

推荐阅读更多精彩内容