有一种将 YAML 加载到对象中的包装方法。
def load_yaml(path):
with io.open(path, encoding='utf-8') as fp:
return yaml.safe_load(fp)
我想使用with
这种方法:
with load_yaml('data.yml') as data:
pass
我收到一个错误:
...
with load_yaml('data.yml) as data:
AttributeError: __enter__
我究竟做错了什么?与 with 一起使用的方法有什么要求?
要求不是针对“方法”(在您的情况下,顺便说一句,这不是方法,而是普通函数),而是针对此“方法”返回的结果。
通常,在 with 之后,不仅可以调用函数,还可以调用任何表达式 - 首先将对其进行完全评估,然后对其结果执行 with。而只是对这个结果有一定的要求。
为了使对象与 with 一起使用,该对象必须具有特殊的方法
__enter__
和__exit__
. 正是在这些方法中,您向解释器解释了它应该如何打开使用该对象的上下文,然后安全地关闭它。有关更多详细信息,您可以在 Google 上搜索“python 上下文管理器”或在此处阅读:
https://habrahabr.ru/post/186608/#context
https://habrahabr.ru/post/196382/
或者