python 中带有继承的类型注解

type annotation with inheritance in python

我正在尝试为 class init 方法提供类型提示,该方法使用特定基 class 的子 classes。 Gooling 如何做到这一点告诉我使用 Type[BaseClass] 作为注释,但是检查一直告诉我我错了。

作为我的问题的一个例子,假设这是 base.py:

class B:
    def __init__(self):
        return

..还有一个 class.py...

class SomeClass:

    def __init__(self, some_param: Type[B]):
        self.sp = some_param

现在,在第三个文件中按以下方式使用这些 classes test.py 给我带来了一些困惑:

from base import B
from class import SomeClass 

if __name__ == '__main__':
    sc = SomeClass(B())

我会猜到这是正确的,但是 pycharm 检查用提示强调它:

Excpected type 'Type[B]', got 'B' instead

因为这不起作用,我认为我可能需要使用 TypeVar,所以我将 base.py 更改为:

class B:
    def __init__(self):
        return

TB = TypeVar('TB', bound=B)

class.py到:

class SomeClass:

    def __init__(self, some_param: Type[TB]):
        self.sp = some_param

但是,这只是将 pycharm 检查更改为:

Excpected type 'Type[TB]', got 'B' instead

最后,如果我将 class.py 设置为:

class SomeClass:

    TB = TypeVar('TB', bound=B)

    def __init__(self, some_param: Type[TB]):
        self.sp = some_param

test.py 中的检查错误消失了,pycharm 没有投诉!

(奇怪的是,如果我将if __name__ == '__main__': sc = SomeClass(B())移动到class.py,仍然会有投诉。)

正如我所说,我对如何通过输入 Python:

真正使用基础 classes 感到有点困惑

如果没有,

Type[B] 表示参数应该是一个 class 对象本身。

例如,

class A:
    pass

class B:
    pass

class C(B):
    pass

def foo(x: Type[B]):
    pass

foo(A)    # fails
foo(B)    # passes
foo(C)    # passes
foo(B())  # fails - an instance of B is not B or a subclass of B

您只需要 B 作为类型提示,以允许 B 实例 (或 [= 的子 class 13=]) 作为参数。

class SomeClass:

    def __init__(self, some_param: B):
        self.sp = some_param