Mypy 标记了我的代码中的一个问题,这让我感到非常困惑。这是说明该问题的代码片段。请注意,这是在 Python 3.12.3 和 mypy 1.10.0 中运行
class A:
pass
class B(A):
pass
def func_of_a(var1: A) -> None:
pass
def func_of_set_of_a(var1: set[A]) -> None:
pass
a = A()
b = B()
b1: B = B()
func_of_a(b1) # mypy does not flag this as being an issue (as expected)
set_of_a: set[A] = {a}
set_of_b: set[B] = {b}
func_of_set_of_a(set_of_a) # mypy does not flag this as being an issue (as expected)
func_of_set_of_a(set_of_b) # mypy flags this as an issue
mypy 将
func_of_set_of_a(set_of_b)
标记为存在以下错误:
错误:“func_of_set_of_a”的参数 1 具有不兼容的类型“set[B]”;预期的“set[A]”[arg-type]
我不明白为什么会对此进行标记。
func_of_a
需要一个 A
类型的对象,并且还将接受 A
任何子类的对象。 func_of_set_of_a
不应该有类似的行为吗? func_of_set_of_a
需要一个 set[A]
,但它不应该也接受 A 子类的一组对象吗?我知道我可以将类型提示更改为 set[A] | set[B]
,但这会使我的代码变得笨拙,因为在我的实际用例中,类 A
有许多子类。
我在这里缺少什么?
我尝试谷歌搜索,但找不到任何相关信息。除非我没注意到,Python 官方文档也没有解决这个问题。
输入 import TypeVar, Set
T = TypeVar('T', 边界=A)
A类: 通过
B类(A): 通过
def func_of_a(var1: A) -> 无: 通过
def func_of_set_of_a(var1: Set[T]) -> 无: 通过
a = A() b = B()
b1: B = B() func_of_a(b1) # mypy 不会将此标记为问题(如预期)
set_of_a:集合[A] = {a} set_of_b: 设置[B] = {b}
func_of_set_of_a(set_of_a) # mypy 不会将此标记为问题(如预期) func_of_set_of_a(set_of_b) # mypy 现在不应该将此标记为问题