Python海象运算符可以用于泛型函数的类型提示吗?

0 投票
2 回答
92 浏览
提问于 2025-04-14 15:47

假设我想在Python 3.12之前给一个通用函数加上类型提示,那时候还没有新的参数语法:

def max[T](args: Iterable[T]) -> T:
    ...

我可以选择使用字符串类型提示:

def max(args: Iterable["T"]) -> "T":
    ...

或者给变量加上类型:

T = TypeVar("T")

def max(args: Iterable[T]) -> T:
    ...

我更喜欢后者的方式,但引入一个额外的全局变量确实是个缺点。所以我决定把通用类型提示和海象运算符结合起来,像这样:

def max(args: Iterable[T := TypeVar("T")]) -> T:
    ...

或者

def max(args: Iterable[T := int | float]) -> T:
    ...

这样的代码运行没有错误,但有些类型库不识别这种语法。写这样的代码有什么缺点呢?

2 个回答

-2
  • 只要类型系统在不断进步(朝着更好的方向发展)
  • 当你无法控制代码运行或检查的环境时(比如说,一个分散的团队)

我会选择和已有工具保持兼容性:这样可以让你的同事少遇到很多意外。所以:在类型提示中不要用海象运算符 :).

1

看起来这个内容没有被记录在文档里,但你的问题在 PEP484 中有提到:

TypeVar() 表达式必须直接赋值给一个变量(不能作为更大表达式的一部分使用)。传给 TypeVar() 的参数必须是一个字符串,且要和它所赋值的变量名相等。类型变量不能被重新定义。

所以,类型检查工具应该会拒绝你提到的代码片段。mypy 确实会这样做Pyright 也是这样,而 Pyre 同样会这样

所以,像这样写代码的主要缺点是,这种代码不符合规范,类型检查工具无法正确理解。

撰写回答