使用泛型时,为什么我会在 VSCode 中收到 Pylance 错误““A*”类型的对象不可调用”?

问题描述 投票:0回答:1

我正在尝试在 Python 3.11 中编写一个泛型类,它应该能够使用不同的处理类(本例中为

A
B
)处理元素列表。我的目标是使用类型变量
T
来指定应该使用的处理类。

这是我的代码:

from typing import List, Self, TypeVar, Generic

class A:
    def __init__(self):
        pass

    def process(self, x):
        return x + 1

class B:
    def __init__(self):
        pass

    def process(self, x):
        return x + 2

T = TypeVar("T", A, B)

class ListProcessor(Generic[T]):
    """Apply a Transformer to the individual list elements."""

    def __init__(self, processor: T):
        self.processor_class = processor
        self.processors: List[T] = []  # <- Pylance complains! see error message (1)

    def process(self, X) -> List:
        x_processed = []
        for x in X:
            proc: T = self.processor_class()  # <- Pylance complains! see error message (2)
            result = proc.process(x)
            x_processed.append(result)
            self.processors.append(proc)
        return x_processed

lp = ListProcessor(B)
lp.process([1, 2, 3])

上面的输出是:

[3, 4, 5]

这正是我所期望的。但是当代码运行时,Pylance 类型检查器在 VSCode 中发出抱怨。

  1. 对于

    self.processors: List[T] = []
    行,我得到:

    类型表达式中不允许使用变量 PylancereportGeneralTypeIssues
    T:~T
    (常数)T:未知

  2. 对于

    proc: T = self.processor_class()
    行,我得到:

    “A*”类型的对象不可调用PylancereportGeneralTypeIssues
    “B*”类型的对象不可调用PylancereportGeneralTypeIssues

我正在努力理解这些错误消息。有人可以帮助澄清为什么会出现这些错误以及如何修复它们吗?

python visual-studio-code generics typing pylance
1个回答
0
投票

self.processors: List[T] = []
应该是
self.processors: List[T] = []
,因为
self.processors
是一个
list
,它将包含
T
类型的实例。

proc: T = self.processor_class()
应该是
proc: T = self.processor_class
因为我们正在分配类本身,而不是类的实例。

最后,在

lp = ListProcessor(B)
行中,您需要使用
B
实例化
B()
类,因为您想要将
B
类的实例传递给
ListProcessor
构造函数。

© www.soinside.com 2019 - 2024. All rights reserved.