我遇到了类似于此的代码:
from contextlib import contextmanager, ContextDecorator
class makepara(ContextDecorator):
def __enter__(self):
print ("<p>")
return self
def __exit__(self, *args):
print ("</p>")
return False
@makepara()
def emit_data():
print (" here is HTML code")
emit_data()
我找到了相关答案this 但是当我将上面的代码更改为
时from contextlib import contextmanager, ContextDecorator
class makepara(ContextDecorator):
def __enter__(self):
print ("<p>")
def __exit__(self, *args):
print ("</p>")
@makepara()
def emit_data():
print (" here is HTML code")
emit_data()
输出没有变化,这让我想知道return self
实际上做了什么以及如何使用?
答案 0 :(得分:4)
您选择返回self
(或其他一些对象,但通常是上下文管理器实例self
),以便可以使用以下语法绑定名称:
with makepara() as var:
...
__enter__
返回的对象将绑定到上下文中的名称var
(实际上,在退出上下文后将保持绑定到var
。)
如果在输入上下文后不需要任何值限制,则可以省略显式返回(在这种情况下将使用隐式返回None
)但是没有任何损害也没有缺点无论如何返回self
。
答案 1 :(得分:2)
return self
不仅在with
语句中有用,而且在许多其他情况下也很有用。
例如,使用以下命令打开文件时
with open("file") as f:
....
函数open
实际上返回一个实现__enter__
的对象,并在其__enter__
中使用return self
来将此实例绑定到变量f
,以便您可以在f.read
之后执行其他操作。
在其他情况下,另一个例子,如果你想链接呼叫(也许data = a.connect().get("key").to_dict()
)。您需要将return self
添加到connect
和get
。
但毕竟,return self
只不过是返回正常变量。