YAML映射到对象

时间:2013-11-05 13:44:56

标签: python yaml pyyaml

在像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,但当我尝试将testObj文件加载到该文件时,类实例.yaml出现问题。

任何想法我做错了什么?

2 个答案:

答案 0 :(得分:1)

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

那就是说,我对分配给__dict__有所保留。它可能是也可能不是实现定义的,并且无论如何它都是黑客的恶意。验证为零,无效数据会导致类型错误或属性错误(或使用YAML.load而不是safe_load,甚至是任意其他错误,包括静默安全漏洞),稍后程序中没有任何迹象表明YAML文件有问题。从长远来看,正确的序列化库是一种更强大和可维护的选择。

答案 1 :(得分:0)

不确定你要做什么......看看http://pyyaml.org/wiki/PyYAMLDocumentation大约在建筑师,代表人,解析者部分的一半。如果你真的希望能够加载你的对象,你想为它创建一个SafeRepresenter和SafeConstructor。