Python 类型为';正在定义什么

Python 类型为';正在定义什么,python,class,type-hinting,Python,Class,Type Hinting,我得到一个错误: NameError:未定义名称“OrgUnit” 我确信这是一个已知的范例,因为它似乎是一个非常常见的层次类使用问题(自引用类)。我知道我可以将的父组织单元的类型更改为对象,并且可以正常工作,但这似乎是错误的,主要是因为它妨碍了我在通话中检查类型的能力。通过将其上级组织单元更改为类型对象我得到了正确的结果: IBM_Worldwide IBM_Worldwide->IBM_USA IBM_Worldwide->IBM_Asia IBM_Worldwide->

我得到一个错误:

NameError:未定义名称“OrgUnit”
我确信这是一个已知的范例,因为它似乎是一个非常常见的层次类使用问题(自引用类)。我知道我可以将
的父组织单元的类型更改为
对象,并且可以正常工作,但这似乎是错误的,主要是因为它妨碍了我在通话中检查类型的能力。通过
将其上级组织单元
更改为类型
对象
我得到了正确的结果:

IBM_Worldwide
IBM_Worldwide->IBM_USA
IBM_Worldwide->IBM_Asia
IBM_Worldwide->IBM_Asia->IBM_China
我愿意听取意见和建议。做这类事情最“python”的方式是什么


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

您的问题是希望使用类型提示,但希望该类本身能够接受其自身类型的参数

类型提示PEP(0484)说明您可以使用。这里的例子是一个
数据结构,它听起来与这个
组织单元
非常相似

例如,这项工作:

class OrgUnit(object):

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

在Python3.7中,您将能够使用来自未来导入注释的
激活。这将自动将注释存储为字符串,而不是对其求值,因此您可以这样做

from __future__ import annotations

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

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

请阅读并深入了解“duck typing”;)Tsk,@flaschbier,如果他想使用类型提示,就让他来吧。这确实有效,但是它不会对无效类型(例如字符串)产生任何问题,例如:failure\u case=OrgUnit(“坏单位”,“字符串”)!本例中没有错误。“本例中没有错误”?在执行期间?你为什么会期待一个错误呢。“没有错误”。Python不是Java的本意:-)@R.G.Abbott:另请参见stackoverflow文档项目的Python语言类型提示部分中的主题。
from __future__ import annotations

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