如何使用后面定义的类型进行函数注解?

Cau*_*uly 7 python annotations python-3.x python-typing

问题是这样的:

class A():
    def foo() -> B:
        pass

class B():
    def bar() -> A:
        pass
Run Code Online (Sandbox Code Playgroud)

这将引发一个NameError: name 'B' is not defined.

为了进行类型检查,我不愿意更改-> B-> "B". 有什么解决方法吗?

lor*_*rey 6

您可以将第一个引用作为字符串传递(Python 3.5+):

class A():
    def foo() -> 'B':
        pass

class B():
    def bar() -> A:
        pass

Run Code Online (Sandbox Code Playgroud)

它被称为“前向参考”,并在PEP484中进行了阐述。有关更多方法和详细信息,请参阅此答案。


Cau*_*uly 2

我找到了一个解决方法,它与 C 或 C++ 非常相似。

在 Pycharm 3 中测试。

class A: pass
class B: pass

class A(object):

    def foo(self, b: B) -> B:

        #CAN auto complete
        b.bar()

        return B()

class B(object):

    def bar(self) -> A:

        return A()

#CAN auto complete
A().foo(B()).bar()
Run Code Online (Sandbox Code Playgroud)