是否有可能在Python attr中自引用类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否有可能在Python attr中自引用类型相关的知识,希望对你有一定的参考价值。

我希望做这样的事情:

@attr.s
class A(object):
    a_dict = attr.ib(factory=Dict, type=Dict[str, A], validator=optional(instance_of(Dict)))

可以像type=Dict一样输入它,但我想知道你是否可以像type=Dict[str, cls]那样进行自我引用,但它可能受到Python可能性的限制。

谢谢。

答案

如果我解释正确,你想要的是这个:

from typing import Dict, Optional

import attr

from attr.validators import optional, instance_of


@attr.s
class A(object):
    a_dict = attr.ib(
        factory=dict,
        type=Optional[Dict[str, "A"]],
        validator=optional(instance_of(dict))
    )


A({"key": A(None)})

它通过了mypy。

请注意:

  • 您不能将typing.Dict用于factory,因为它实际上仅用于类型提示,如果您尝试实例化它则会失败。
  • instance_of在内部使用isinstance(),而isinstance({}, Dict)是True,我认为不打算像那样使用它。
  • 如果a_dict是验证器可选的,你还需要通过将它包装在Optional[]中来使用类型注释声明它是可选的。
另一答案

问题是class A(object): A导致NameError: name 'A' is not defined。这意味着在创建定义块时,不能通过名称引用类。

我认为要在键入时解决这个问题,可以使用字符串代替:type=Dict[str, 'A']。我记得看到这是如何制作前向引用,但这可能不对。

另一答案

clsself是按类型赋予类及其实例的名称,它们分别作为参数传递给类方法和实例方法。也不会定义您尝试使用它们的位置。

你可以做的是强制将类型强制为A的非对象超类,如果有的话。

以上是关于是否有可能在Python attr中自引用类型的主要内容,如果未能解决你的问题,请参考以下文章

python中自定义函数类的引用(最全)

在SVN中自定义合并二进制文件

知识点—python数据类型1

可以引用 JSON 数字吗?

python交互环境中导入文件中自定义的函数报错

如何在 PyFlink 1.10 中自定义 Python UDF?