在您进入块和离开时with
调用对象上的使用。所以当你这样做时__enter__
with
__exit__
res = resource.Resource()
with res.request() as req:
# stuff
你真的__enter__
在调用一个 Request 对象,#stuff
然后调用__exit__
:
class Request(base.Put):
def __exit__(self, exc_type, value, traceback):
super(Request, self).__exit__(exc_type, value, traceback)
self.resource.release(self)
class Put(Event): # base.Put
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
# If the request has been interrupted, remove it from the queue:
if not self.triggered:
self.resource.put_queue.remove(self)
因此,该with
块等价于:
res = resource.Resource(...)
req = res.request()
#stuff
if not req.triggered:
res.put_queue.remove(req)
res.release(req)
但是,该with
块还确保无论在#stuff
. 使用上面的代码你会失去它。