是否可以使用 Python 的受约束的 TypeVar 使子类不兼容?



根据文档,受约束的TypeVars应完全匹配

然而,当使用自定义类时,这种行为似乎违反直觉:

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中定义的类型之一,但不会引发任何警告。

我的问题是:

  1. 为什么这里没有发出警告
  2. 有没有一种方法可以允许特定的类而不是它的子类

这些示例是使用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

相关内容

  • 没有找到相关文章

最新更新