是否可以在 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的可能性的限制。
谢谢。
cls
和 self
是按照惯例赋予 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[]
. 中使用类型注释来声明它是可选的
我想做这样的事情:
@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的可能性的限制。
谢谢。
cls
和 self
是按照惯例赋予 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[]
. 中使用类型注释来声明它是可选的