我正在尝试为使用特定基类的子类的类初始化方法提供类型提示。 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中真正使用基类感到有些困惑:
如果没有,
Type[B]
不足/无法工作?TypeVar
,而不能简单地import TypeVar
?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
作为类型提示,以允许B
的instance(或B
的子类)作为参数。
class SomeClass:
def __init__(self, some_param: B):
self.sp = some_param