我想做这样的事情:
@attr.s
class A(object):
a_dict = attr.ib(factory=Dict, type=Dict[str, A], validator=optional(instance_of(Dict)))
可以按 as 输入,type=Dict
但我想知道您是否可以自我引用 like type=Dict[str, cls]
,但它可能会受到 Python 可能性的限制。
谢谢。
我想做这样的事情:
@attr.s
class A(object):
a_dict = attr.ib(factory=Dict, type=Dict[str, A], validator=optional(instance_of(Dict)))
可以按 as 输入,type=Dict
但我想知道您是否可以自我引用 like type=Dict[str, cls]
,但它可能会受到 Python 可能性的限制。
谢谢。
问题是class A(object): A
导致NameError: name 'A' is not defined
. 这意味着在定义块中创建类时,不能通过其名称引用类。
我认为要在打字时解决这个问题,可以使用字符串来代替:type=Dict[str, 'A']
. 我记得看到这是如何进行前向引用的,但这可能不正确。
cls
和self
是按照约定赋予类及其实例的名称,当它们分别作为参数传递给类方法和实例方法时。两者都不会在您尝试使用它们的地方定义。
相反,您可以做的是将类型强制为 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
for,factory
因为它实际上只是用于类型提示,如果您尝试实例化它会失败。instance_of
在内部使用isinstance()
,whileisinstance({}, Dict)
是真的,我不认为它是打算这样使用的。Optional[]
.