python-3.x - 如何使用 ruamel.yaml 从 YAML 文件加载 Python lambda 表达式?

标签 python-3.x serialization lambda yaml ruamel.yaml

我正在尝试使用 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/

相关文章:

c# - 更改在 .Net 中序列化的类的名称?

java - Jackson 序列化 null 或空对象

c# - 我可以在 lambda 表达式中调用函数吗?

c# - WCF Ajax 服务 - 如何将数组或 JSON 传递给服务?方法参数类型应该是什么?

c# - 通过匿名方法分配匿名类型的属性

python - 在 lambda 中使用导入函数 - Python

python - 为什么这段 python 代码运行了两次

python - 使用用户 tkinter 输入作为 Matplotlib 的坐标绘制一条线

python - Pandas 系列中的特殊字符串格式

python - 更新带有列表的 python 字典