gpt4 book ai didi

python - Mypy 似乎忽略了 TypeVar 类型的界限

转载 作者:行者123 更新时间:2023-12-01 08:24:08 26 4
gpt4 key购买 nike

例如,我有一段代码如下:

from typing import Type, TypeVar, cast

class SuperClass:
pass


T = TypeVar('T', bound=SuperClass)


def cast_to(obj: SuperClass, cast_to: Type[T] = SuperClass) -> T:
return cast(cast_to, obj)

我将其保存在type_check.py中。如果我在上面运行 mypy,我会收到以下错误消息:

type_check.py:10: error: Incompatible default for argument "cast_to" (default has type "Type[SuperClass]", argument has type "Type[T]")
type_check.py:11: error: Invalid type "cast_to"

根据我对TypeVarbound的理解,只要TSuperClass的子类,应该没问题。但是为什么 mypy 会在这里抛出错误呢?谢谢!

最佳答案

您的代码有两个问题:首先,您的 cast_to 函数的签名应该是:

def cast_to(obj: SuperClass, cast_to: Type[T] = Type[SuperClass]) -> T:

然后,在您的 cast 语句中,我不确定 mypy 是否允许您使用 cast_to 作为 的第一个参数> Actor 。相反,您可以尝试:

def cast_to(obj: SuperClass, cast_to: Type[T]) -> T:
return cast(T, obj)

当然,根据这一定义,您将无法仅使用一个参数来调用 cast_to

<小时/>

我现在要问:为什么你觉得你需要这样做?你确定你的设计很好吗? cast 应该在非常特殊的情况下使用;文档指出:

Casts are used to silence spurious type checker warnings and give the type checker a little help when it can’t quite understand what is going on.

所以你应该在这里认真质疑你的设计!请向我们提供更多有关您想要实现的目标的信息。也许有比您想要做的更好、更简洁的设计。

关于python - Mypy 似乎忽略了 TypeVar 类型的界限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54413538/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com