Python 3.6类型:在赋值之前使用变量

Phi*_*nin 3 python types python-3.x

类型/提示/分配的新方法很酷,但我不知道如何使这么简单的事情起作用:

class MyContainer:
    def addMyItem(self, item:MyItem):
        pass

class MyItem:
    def __init__(self, container:MyContainer):
        pass
Run Code Online (Sandbox Code Playgroud)

它抛出一个错误:Using variable 'MyItem' before assignment.到目前为止我发现的最好但超级丑陋的解决方法是:

class MyContainer:
    def addMyItem(self, untypeditem):
        item:MyItem=untypeditem
        pass

class MyItem:
    def __init__(self, container:MyContainer):
        pass
Run Code Online (Sandbox Code Playgroud)

请告诉我,#1原则的语言可以Beautiful is better than ugly更好地解决这个常见的打字问题

AKX*_*AKX 6

前向引用只是引用名称的字符串(因为它在模块中可见).

class MyContainer:
    def addMyItem(self, item: 'MyItem'):
        pass

class MyItem:
    def __init__(self, container: 'MyContainer'):
        pass
Run Code Online (Sandbox Code Playgroud)

如果您需要从其他地方导入名称(并且您只需要用于类型检查的名称,或者它可能导致循环导入),您可以使用

import typing

if typing.TYPE_CHECKING:
    from foo import Thing
Run Code Online (Sandbox Code Playgroud)

TYPE_CHECKING 仅当类型检查器正在运行时才会成立(即您的代码未被评估执行).