根据文档,受约束的TypeVar
s应完全匹配。
然而,当使用自定义类时,这种行为似乎违反直觉:
from dataclasses import dataclass
from typing import Generic, TypeVar
@dataclass
class PrinterConnection:
name: str = ""
@dataclass
class WiFiPrinterConnection(PrinterConnection):
name = "WiFi"
@dataclass
class USBPrinterConnection(PrinterConnection):
name = "USB"
@dataclass
class USBTypeCPrinterConnection(USBPrinterConnection):
name = "USB-C"
Connection = TypeVar("Connection", USBPrinterConnection, WiFiPrinterConnection)
@dataclass
class Printer(Generic[Connection]):
connection: Connection
Printer(WiFiPrinterConnection()) # No Warning - As Expected
Printer(USBPrinterConnection()) # No Warning - As Expected
Printer(USBTypeCPrinterConnection()) # No Warning - NOT Expected
在本例中,USBTypeCPrinterConnection
不是在TypeVar
中定义的类型之一,但不会引发任何警告。
我的问题是:
- 为什么这里没有发出警告
- 有没有一种方法可以允许特定的类而不是它的子类
这些示例是使用Python 3.10和Pylance进行类型检查的。
受约束的TypeVar
必须解析为指定类型之一,子类可以解析为其父类。
考虑
from typing import TypeVar
class Parent:
pass
class Child(Parent):
pass
T = TypeVar("T", Parent, int) # We need at least two arguments
def foo(x: T) -> T: return x
reveal_type(foo(Child())) # Parent
游乐场
正如您所看到的,即使我们传递了Child
,类型var也被解析为Parent
。