我正在尝试在 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 中发出抱怨。
对于
self.processors: List[T] = []
行,我得到:
类型表达式中不允许使用变量 PylancereportGeneralTypeIssues
T:~T
(常数)T:未知
对于
proc: T = self.processor_class()
行,我得到:
“A*”类型的对象不可调用PylancereportGeneralTypeIssues
“B*”类型的对象不可调用PylancereportGeneralTypeIssues
我正在努力理解这些错误消息。有人可以帮助澄清为什么会出现这些错误以及如何修复它们吗?
行
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
构造函数。