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

标签 python inheritance pycharm type-hinting base-class

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

相关文章:

python - 在显微镜研究中围绕异质纹理组织绘制边界

Java 继承 - Fly(程序)运行时打印什么?

java - 为什么不使用工具来扩展工作?

python - Pygame 窗口没有响应,但程序继续运行

python - 403 Forbidden while trying to display image from url - Kivy

python - 获取 Django 模型的 JSON 表示

c++ - 将 "this"传递给线程 C++

python - 当我开始打字时 PyCharm 崩溃

python - 使用 pycharm 创建的 Pyramid 项目引发 ValueError : Variable assignment

python - 使用lxml获取div HTML内容