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

时间:2019-03-13 12:57:23

标签: python python-2.7 python-attrs

我正在做这样的事情:

"action=my_user_vote&post_id=1&nonce=2b2eaea6d3"

可以像application/json一样键入它,但是我想知道是否可以像POST那样进行自引用,但是它可能受到Python的限制。

谢谢。

3 个答案:

答案 0 :(得分:1)

code_commit=`git subtree split -P code` git rm --quiet -r code git checkout --orphan new git commit --quiet -m 'Add static files' git branch -M new master git subtree add -P code $code_commit cls是当将它们作为参数传递给 class方法 instance方法分别。在尝试使用它们的地方都不会定义。

您可能可以做的是,将类型强制为A的非对象超类(如果有)。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

如果我的解释正确,那么您想要的是这样:

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[]中来使用类型注释将其声明为可选。