0

在 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

任何想法我做错了什么?

4

2 回答 2

1

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

也就是说,我对分配给__dict__. 它可能是实现定义的,也可能不是实现定义的,在任何情况下,它都散发着黑客的味道。验证为零,无效数据会导致程序稍后出现类型错误或属性错误(或者用YAML.load代替,甚至是任意其他错误,包括无声的安全漏洞),而没有迹象表明 YAML 文件有问题。safe_load从长远来看,适当的序列化库是更健壮和可维护的选择。

于 2013-11-05T13:55:01.500 回答
0

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

于 2013-11-05T14:02:56.663 回答