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 感到有点困惑
- 这只是一个 pycharm 错误吗?
如果没有,
- 为什么
Type[B]
不是 enough/working?
- 为什么需要在 class 中指定一个
TypeVar
而不能简单地 import TypeVar
?
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
我正在尝试为 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 感到有点困惑- 这只是一个 pycharm 错误吗?
如果没有,
- 为什么
Type[B]
不是 enough/working? - 为什么需要在 class 中指定一个
TypeVar
而不能简单地 importTypeVar
?
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