我正在尝试使用 ruamel.yaml
序列化和反序列化包含 lambda 表达式的对象。如示例所示,这会产生一个 ConstructorError
。如何做到这一点?
import sys
import ruamel.yaml
yaml = ruamel.yaml.YAML(typ='unsafe')
yaml.allow_unicode = True
yaml.default_flow_style = False
foo = lambda x: x * 2
yaml.dump({'foo': foo}, sys.stdout)
# foo: !!python/name:__main__.%3Clambda%3E
yaml.load('foo: !!python/name:__main__.%3Clambda%3E')
# ConstructorError: while constructing a Python object
# cannot find '<lambda>' in the module '__main__'
# in "<unicode string>", line 1, column 6
最佳答案
那是行不通的。 ruamel.yaml 通过引用它们的名称来引用源代码中的那些函数来转储函数(或方法)(即它不会尝试存储实际代码)。
您的 lambda
是一个匿名函数,因此没有可以正确检索的名称。以同样的方式Python的pickle不支持 lambda
。
我不确定尝试转储 lambda
是否应该是一个错误,或者是否应该发出警告。
简单的解决方案是将您的 lambda
(s) 变成命名函数。或者,您可能能够获取 lambda 的实际代码或 AST 并存储和检索它,但这将需要更多工作并且可能不可移植,具体取决于您存储的内容。
关于python-3.x - 如何使用 ruamel.yaml 从 YAML 文件加载 Python lambda 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57280268/