3

When using a with statement without a as, does the __enter__ function never get executed but the __exit__ method will?

Example:

with test:
  test.do_something

test.__exit__() will be executed at the end of the with clause but test.__enter__() won't?

4

1 回答 1

12

他们总是*都被执行。唯一的区别是,如果不使用as__enter__函数的返回值将被丢弃。with声明文档中很好地列出了精确的步骤。

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__也不会被调用。

于 2013-06-12T22:02:11.373 回答