带有python继承的类型注释

问题描述 投票:1回答:1

我正在尝试为使用特定基类的子类的类初始化方法提供类型提示。 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

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

from base import B
from class import SomeClass 

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

我会猜想这是正确的,但是pycharm检查在提示下加了下划线:

预期类型'Type [B]',改为'B'

因此,由于这行不通,我认为可能需要使用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检查更改为:

预期类型'Type [TB]',取而代之'B'

最后,如果我将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中真正使用基类感到有些困惑:

  • 这仅仅是pycharm错误吗?

如果没有,

  • 为什么Type[B]不足/无法工作?
  • 为什么要在类中指定TypeVar,而不能简单地import TypeVar
python inheritance pycharm typing base-class
1个回答
0
投票

Type[B]用于指示该参数应为类对象本身。

例如,

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作为类型提示,以允许Binstance(或B的子类)作为参数。

class SomeClass:

    def __init__(self, some_param: B):
        self.sp = some_param
© www.soinside.com 2019 - 2024. All rights reserved.