【问题标题】:YAML mappings to objectsYAML 到对象的映射
【发布时间】:2013-11-05 13:44:56
【问题描述】:

在 Python 等动态语言中,我知道可以轻松地将 YAML 映射转换为对象。它可以是一个非常强大的功能,并且可以节省大量编码。

当我尝试将.yaml 文件映射到对象时遇到问题。

文件: objtest.yaml

---
  test: yaml test   
  option: this is option
...

我的代码:

class MyTest(object):
    pass

testObj = MyTest()

f = open(os.path.join(os.path.dirname(__file__), 'objtest.yaml'))

rawData = yaml.safe_load(f)

print rawData

testObj.__dict__ = yaml.load(f)

f.close()

print testObj

STDOUT(带追溯):

{'test': 'yaml test', 'option': 'this is option'}
Traceback (most recent call last):
  File "C:/CROW/ATE/Workspace/Sandbox/test.py", line 23, in <module>
    testObj.__dict__ = yaml.load(f)
TypeError: __dict__ must be set to a dictionary, not a 'NoneType'

问题:

如您所见,文件已加载到 rawData,但当我尝试将 .yaml 文件加载到类实例 testObj 时出现问题。

任何想法我做错了什么?

【问题讨论】:

    标签: python yaml pyyaml


    【解决方案1】:

    rawData = yaml.safe_load(f) 读取文件,这意味着后面的yaml.load(f) 无法从文件中读取更多数据。虽然您可以回退查找指针,但绝对没有理由:您已经加载了 YAML 文档(也以更安全的方式)。只需testObj.__dict__ = rawData

    也就是说,我对分配给__dict__ 持保留意见。它可能是实现定义的,也可能不是实现定义的,并且在任何情况下它都散发着黑客的味道。验证为零,无效数据导致类型错误或属性错误(或使用 YAML.load 而不是 safe_load,甚至是任意其他错误,包括无声的安全漏洞),但没有迹象表明 YAML 文件位于过错。从长远来看,一个合适的序列化库是一个更健壮和可维护的选择。

    【讨论】:

    • 谢谢!它解决了这个问题,关于__dict__ 我有一个测试 YAML 有效性的代码,你还认为它不安全吗? YAML 文件用作用户必须可读的配置,这就是为什么它优于 JSON 和 XML。
    • @KobiK 我不反对 YAML(我自己使用它),出于上述原因,我反对不必要地摆弄 __dict__。验证(假设它是正确的)减轻了这些担忧。安全问题与__dict__ 分配无关,该措辞具有误导性——漏洞发生在load 的执行期间。但是对于用户配置,这可能不是一个高优先级的问题。
    【解决方案2】:

    不确定您到底要做什么...看看http://pyyaml.org/wiki/PyYAMLDocumentation 大约在构造函数、表示器、解析器部分的一半。如果你真的希望你的对象能够被加载,你想为它创建一个 SafeRepresenter 和 SafeConstructor。

    【讨论】:

      猜你喜欢
      • 2017-02-17
      • 2017-01-17
      • 2017-09-16
      • 1970-01-01
      • 2019-07-08
      • 2016-07-13
      • 2018-11-23
      • 2019-05-27
      • 2019-09-19
      相关资源
      最近更新 更多