亚姆不叫建筑工人

2024-05-03 07:55:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着按照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中做了一个快速评估,并观察到了相同的结果。在

编辑

我想做的是:为了保持在链接的示例(文档)中,如果MonstersnameB开头,则将ac的值加倍。在


Tags: 代码文档importyaml示例属性herefoo
2条回答

根据文件:

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__,然后使用instance.__dict__设置类上的字段。有关详细信息,请参见this method。在

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

我想我有一个根本的误解。我不知道这个假设是否成立,但我认为

load, dump = yaml.load, yaml.dump
foo = "any valid yaml string"

load(foo) == load(dump(load(foo))) # should be true

如果我现在按照我在问题中建议的那样,在加载时真正改变一个属性,就会改变这个“等式”,并导致我最不希望出现的行为。在

相关问题 更多 >