python中的“with”语句__exit__

时间:2013-06-12 22:00:16

标签: python

使用不带with的{​​{1}}语句时,as函数是否永远不会执行,但__enter__方法会执行?

示例:

__exit__

with test: test.do_something 将在with子句的末尾执行,但test.__exit__()不会执行?

1 个答案:

答案 0 :(得分:11)

他们总是被执行。唯一的区别是,如果不使用as,则会丢弃__enter__函数的返回值。精确的步骤在with statement documentation中很好地列出。

class T(object):
    def __enter__(self):
        print('entering')
        return self
    def __exit__(self, exc_t, exc_v, trace):
        print('exiting')

with T():
    pass

>>> entering
>>> exiting

唯一的区别是你是否可以使用创建的对象:

with T() as t:
    print(t)

>>> entering
>>> <__main__.T object at 0x00B34810>
>>> exiting

请注意,第二个示例还显示何时调用 __exit__:具体来说,它是在循环完成时调用的。


*只有__enter__抛出异常才会执行它们的唯一时间,在这种情况下,永远不会到达上下文管理器的套件,并且不会调用__exit__