在像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
出现问题。
任何想法我做错了什么?
答案 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。