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

Is it possible to self-reference type in 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的可能性的限制。

谢谢。

clsself 是按照惯例赋予 classes 及其实例的名称,当它们作为参数传递给 class 方法时 实例方法 分别。两者都不会在您尝试使用它们的地方定义。

您可以改为将类型强制为 A 的非对象 superclass,如果有的话。

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

我认为要在打字时解决这个问题,可以改用字符串:type=Dict[str, 'A']。我记得这是如何进行前向引用的,但这可能不正确。

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

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) 是正确的,但我不认为它是打算那样使用的。
  • 如果 a_dict 根据验证器是可选的,您还需要通过将其包装在 Optional[].
  • 中使用类型注释来声明它是可选的