gpt4 book ai didi

python - python 中带有继承的类型注释

转载 作者:行者123 更新时间:2023-12-01 06:49:37 26 4
gpt4 key购买 nike

我试图为类 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com