繁体   English   中英

是否可以在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是将约定分别作为类方法实例方法的参数传递给及其实例的名称 在您尝试使用它们的地方都不会定义。

相反,您可以执行的是将类型强制为A的非对象超类 (如果有)。

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

我认为要解决此输入问题,可以改用字符串: 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)为True时,我认为它不是要像这样使用的。
  • 如果a_dict根据验证器是可选的,则还需要通过将其包装在Optional[]来使用类型注释将其声明为可选。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM