2024-09-21 00:57:57 发布
网友
我想做些类似的事情:
@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的限制。在
type=Dict
type=Dict[str, cls]
谢谢。在
如果我的解释是正确的,你想要的是:
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)})
然后我就过去了。在
请注意:
typing.Dict
factory
instance_of
isinstance()
isinstance({}, Dict)
Optional[]
cls和self是按照约定给类及其实例的名称,当它们分别作为参数传递给类方法和实例方法时。它们都不会被定义在你试图使用它们的地方。在
cls
self
相反,您可能能够做的是将类型强制为a的非object超类,如果存在的话。在
问题是class A(object): A导致NameError: name 'A' is not defined。这意味着在类的定义块中创建类时,不能通过它的名称来引用它。在
class A(object): A
NameError: name 'A' is not defined
我认为在键入时要避开这个问题,可以使用一个字符串:type=Dict[str, 'A']。我记得我把这看作是转发引用的方式,但这可能不对。在
type=Dict[str, 'A']
如果我的解释是正确的,你想要的是:
然后我就过去了。在
请注意:
typing.Dict
用于factory
,因为它实际上只是用于类型提示,如果尝试实例化它,则会失败。在instance_of
在内部使用isinstance()
,虽然isinstance({}, Dict)
是真的,但我不认为它是这样使用的。在Optional[]
中来声明它是可选的。在cls
和self
是按照约定给类及其实例的名称,当它们分别作为参数传递给类方法和实例方法时。它们都不会被定义在你试图使用它们的地方。在相反,您可能能够做的是将类型强制为a的非object超类,如果存在的话。在
问题是
class A(object): A
导致NameError: name 'A' is not defined
。这意味着在类的定义块中创建类时,不能通过它的名称来引用它。在我认为在键入时要避开这个问题,可以使用一个字符串:
type=Dict[str, 'A']
。我记得我把这看作是转发引用的方式,但这可能不对。在相关问题 更多 >
编程相关推荐