gpt4 book ai didi

python - YAML 不调用构造函数

转载 作者:行者123 更新时间:2023-11-28 22:59:03 24 4
gpt4 key购买 nike

我已尝试按照说明进行操作 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 ) 等等。阅读文档,我找不到我的错误,因为它表明调用构造函数时将所有键值对作为关键字参数。

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

这里有人知道吗?

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

编辑

我想做的:留在链接示例(文档)中,如果 MonsternameB 开头,将 ac 的值加倍。

最佳答案

来自文档:

yaml.YAMLObject uses metaclass magic to register a constructor, which transforms a YAML node to a class instance, and a representer, which serializes a class instance to a YAML node.

在内部,由 yaml.YAMLObject 注册的默认 constructor 将调用 YourClass.__new__ 然后使用 在你的类上设置字段>实例.__dict__。参见 this method了解更多详情。

根据你想做什么,你可以在 Step.__new__ 中加入一些逻辑(但你不会在 **kwargs 中得到任何字段>,或 register a custom constructor

关于python - YAML 不调用构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13331222/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com