在您进入块和离开时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. 使用上面的代码你会失去它。