【问题标题】:Object created with pyyaml doesn't have some attributes [duplicate]使用 pyyaml 创建的对象没有某些属性 [重复]
【发布时间】:2018-06-07 08:32:53
【问题描述】:

我想用 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]

如您所见,我的对象没有“年龄”属性!因此调用

print(p.age)

会产生错误。

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

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

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

【问题讨论】:

    标签: python pyyaml


    【解决方案1】:

    我找到了解决方案(感谢@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))
    

    【讨论】:

      猜你喜欢
      • 2016-04-08
      • 1970-01-01
      • 2012-12-27
      • 2018-05-27
      • 2020-07-11
      • 1970-01-01
      • 2014-09-24
      • 1970-01-01
      • 2015-09-08
      相关资源
      最近更新 更多