我试图为使用特定基类的子类的类初始化方法提供类型提示。 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检查更改为:
预期类型为“ [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
,而不能简单地导入 TypeVar
?答案 0 :(得分:1)
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