YAML 不调用构造函数

wal*_*mat 4 python yaml python-3.x

我尝试按照此处的说明进行操作,这使我找到了以下代码:

import yaml
class Step(yaml.YAMLObject):

    yaml_tag = "!step"

    def __init__(self, *args, **kwargs):
        raise Exception("Intentionally.")

yaml.load("""
--- !step
    foo: bar
    ham: 42
""")
Run Code Online (Sandbox Code Playgroud)

预期行为:我得到一个例外。但我观察到的是,我的 YAML 标记生成了一个Step实例,我可以使用它、访问方法、属性(如foo上面的代码)等等。阅读文档,我找不到我的错误,因为它表明使用所有键值对作为关键字参数调用构造函数。

基本上文档中的示例有效,但不是因为构造函数的实现,而是因为键值对( 的属性Monster)用于填充对象的字典。

这里有人知道吗?

我正在使用 python3,但在 python2 中进行了快速评估并观察到相同的情况。

编辑

我想做的事:为了保持在链接的例子(文档),如果Monster小号name带开始B,双倍的价值ac

jbo*_*wes 5

从文档:

yaml.YAMLObject 使用元类魔法来注册一个构造函数,它将一个 YAML 节点转换为一个类实例,以及一个表示器,它将一个类实例序列化为一个 YAML 节点。

在内部,默认 constructor 注册者yaml.YAMLObject将调用YourClass.__new__然后使用instance.__dict__. 有关更多详细信息,请参阅此方法

根据您想要做什么,您可以放入一些逻辑Step.__new__(但您不会在 中获取任何字段**kwargs,或者注册一个自定义构造函数