【问题标题】:Type Hinting for objects of type that's being defined [duplicate]类型提示正在定义的类型的对象[重复]
【发布时间】:2016-06-07 15:43:29
【问题描述】:

我得到错误:

NameError: name 'OrgUnit' is not defined
class OrgUnit(object):

    def __init__(self,
                 an_org_name: str,
                 its_parent_org_unit: OrgUnit= None
                 ):
        self.org_unit_name = an_org_name
        self.parent_org_unit = its_parent_org_unit

    def __str__(self):
        if self.parent_org_unit:
            parent_org_unit_name = self.parent_org_unit.__str__()
            return parent_org_unit_name + "->" + self.org_unit_name
        else:
            return self.org_unit_name


if __name__ == '__main__':
    ibm_worldwide = OrgUnit("IBM_Worldwide")
    ibm_usa = OrgUnit("IBM_USA", ibm_worldwide)
    ibm_asia = OrgUnit("IBM_Asia", ibm_worldwide)
    ibm_china = OrgUnit("IBM_China", ibm_asia)
    print(ibm_worldwide)
    print(ibm_usa)
    print(ibm_asia)
    print(ibm_china)

我确信这是一个已知的范例,因为它似乎是一个非常常见的分层类使用问题(自引用类)。我知道我可以将 its_parent_org_unit 的类型更改为 object 并且它可以工作,但这似乎是错误的做法,主要是因为它破坏了我在调用中检查类型的能力。随着 its_parent_org_unit 更改为类型 object 我得到正确的结果:

IBM_Worldwide
IBM_Worldwide->IBM_USA
IBM_Worldwide->IBM_Asia
IBM_Worldwide->IBM_Asia->IBM_China

我愿意接受想法和建议。做这种事情最“pythonic”的方式是什么?

PS:这种“自引用类”范例/问题的名称是什么,我可以用它来查找其他建议吗?

【问题讨论】:

  • 请阅读this 并深入了解“鸭子打字”;)
  • 啧,@flaschbier,如果他想使用类型提示,让他。

标签: python class oop type-hinting python-typing


【解决方案1】:

你的问题是你想使用类型提示,但你希望这个类本身能够接受它自己类型的参数。

类型提示 PEP (0484) 解释说您可以使用string version of the type's name as a forward reference。这里的示例是 Tree 数据结构,听起来与 OrgUnit 非常相似。

例如,这是有效的:

class OrgUnit(object):

    def __init__(self,
                 an_org_name: str,
                 its_parent_org_unit: 'OrgUnit' = None
                 ):

在 Python 3.7 中,您将能够使用 from __future__ import annotations 激活 postponed evaluation of annotations。这将自动将注释存储为字符串而不是评估它们,因此您可以这样做

from __future__ import annotations

class OrgUnit(object):
    def __init__(self,
                 an_org_name: str,
                 its_parent_org_unit: OrgUnit= None
                 ):
        ...

这计划成为 Python 4.0 中的默认设置。

【讨论】:

  • 这确实有效,但是它不会对无效类型(例如字符串)产生任何问题,例如: failure_case = OrgUnit("Bad Unit", "a String")!在这种情况下没有错误。
  • “这种情况下没有错误”?执行期间?为什么会出现错误?
  • 重新。 “没有错误”。 Python 不是 Java 故意 :-)
  • @R. G. Abbott:另请参阅 stackoverflow 文档项目的 Python 语言 Type Hints 部分中的 Class Members and Methods 主题。
猜你喜欢
  • 2017-11-21
  • 2013-10-24
  • 2016-01-27
  • 2021-05-10
  • 2017-04-29
  • 2017-07-05
相关资源
最近更新 更多