Python 中子对象的问题类型提示集

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

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 官方文档也没有解决这个问题。

python mypy type-hinting
1个回答
0
投票

输入 import TypeVar, Set

定义一个上限为 A 的 TypeVar

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 现在不应该将此标记为问题

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