使用 pyyaml 创建的对象没有某些属性
Object created with pyyaml doesn't have some attributes
我想用 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}
"""
但这对我来说没有意义,因为 class 可能有数百个内部属性。像这样创建这样的对象是不可能的。
我找到了解决方案(感谢@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))
我想用 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}
"""
但这对我来说没有意义,因为 class 可能有数百个内部属性。像这样创建这样的对象是不可能的。
我找到了解决方案(感谢@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))