使用不带with
的{{1}}语句时,as
函数是否永远不会执行,但__enter__
方法会执行?
示例:
__exit__
with test:
test.do_something
将在with子句的末尾执行,但test.__exit__()
不会执行?
答案 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__
。