我试着按照here的说明操作,这段代码是:
import yaml
class Step(yaml.YAMLObject):
yaml_tag = "!step"
def __init__(self, *args, **kwargs):
raise Exception("Intentionally.")
yaml.load("""
--- !step
foo: bar
ham: 42
""")
预期行为:我得到一个例外。但我观察到的是,我的YAML标记产生了一个Step
实例,我可以使用它、访问方法、属性(如上面代码中的foo
)等等。在阅读文档时,我找不到我的错误,因为它建议使用所有键-值对作为关键字参数调用构造函数。在
基本上,doc中的示例可以工作,但不是因为构造函数的实现,而是因为键值对(即Monster
的属性)用于填充对象的dict
有人知道吗?在
我正在研究python3,但是在python2中做了一个快速评估,并观察到了相同的结果。在
编辑
我想做的是:为了保持在链接的示例(文档)中,如果Monster
sname
以B
开头,则将ac
的值加倍。在
根据文件:
在内部,
yaml.YAMLObject
注册的默认constructor
将调用YourClass.__new__
,然后使用instance.__dict__
设置类上的字段。有关详细信息,请参见this method。在根据您想做什么,您可以在
Step.__new__
中放入一些逻辑(但是您不会得到**kwargs
中的任何字段,或者register a custom constructor。在我想我有一个根本的误解。我不知道这个假设是否成立,但我认为
如果我现在按照我在问题中建议的那样,在加载时真正改变一个属性,就会改变这个“等式”,并导致我最不希望出现的行为。在
相关问题 更多 >
编程相关推荐