用pyyaml创建的对象没有一些属性[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

我想用PyYAML创建一个对象。请考虑以下代码:

import yaml

doc = """
- !!python/object:__main__.Person {name: abc}
"""

class Person(object):
    def __init__(self, name):
        self.name = name
        self.age = 26

data = yaml.load(doc)
p = data[0]
print(dir(p))

上面代码的输出是:

[__class__,__delattr__,__dict__,__dir__,__doc__,__eq__,__format__,__ge__,__getattribute__,__gt__,__hash__,__init__,__le__,__lt__,__module__,__ne__,__new__,__reduce__,__reduce_ex__,__repr__,__setattr__,__sizeof__,__slotnames__,__str__,__subclasshook__,__weakref__,name]

如您所见,我的对象没有'age'属性!因此呼唤

print(p.age)

会产生错误。

我该如何解决这个问题?我知道我可以用

doc = """
- !!python/object:__main__.Person {name: abc, age: 26}
"""

但它对我没有意义,因为一个类可能有数百个内部属性。创建这样的对象是不可能的。

python pyyaml
1个回答
0
投票

我找到了解决方案(感谢@asherbar的评论):

import yaml

doc = """
- !Person {name: abc}
"""

def yamlobj(tag):
    def wrapper(cls):
        def constructor(loader, node):
            fields = loader.construct_mapping(node)
            return cls(**fields)
        yaml.add_constructor(tag, constructor)
        return cls
    return wrapper

@yamlobj('!Person')
class Person(object):
    def __init__(self, name):
        self.name = name
        self.age = 26

data = yaml.load(doc)
p = data[0]
print(dir(p))
© www.soinside.com 2019 - 2024. All rights reserved.