我试图为类 init 方法提供类型提示,该方法使用特定基类的子类。搜索如何执行此操作告诉我使用 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 检查用提示强调了它:
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 中输入感到有点困惑:
- 这只是 pycharm 错误吗?
如果没有,
- 为什么是
Type[B]
还不够/工作吗? - 为什么需要指定
TypeVar
在类中,不能简单地导入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
的实例 (或 B
的子类)作为参数。
class SomeClass:
def __init__(self, some_param: B):
self.sp = some_param
关于python - python 中带有继承的类型注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59078860/