文字省略号作为ParamSpec的最后一个参数真的有效吗



引用Python文档中的Concatenate:

连接的最后一个参数必须是ParamSpec或省略号(…)。

我知道ParamSpec是什么,但这里的省略号让我抓狂。mypy:不接受

from typing import Callable, ParamSpec, Concatenate, TypeVar, Generic
_P = ParamSpec('_P')
_T = TypeVar('_T')

class Test(Generic[_P, _T]):
fn: Callable[Concatenate[_P, ...], _T]
E: Unexpected "..." [misc]
E: The last parameter to Concatenate needs to be a ParamSpec  [valid-type]

并且在文档中没有任何解释。PEP612没有提到。这只是一个错误,是CallableConcatenate混合在一起的结果吗?

这个问题在某种程度上是相关的,并显示了Concatenate:中带有省略号文字的语法

应该扩展规范以允许Concatenate[int, str, ...][int, str, ...]或其他语法。

但这显然是针对";未来语法";。

注意:我知道省略作为Callable论点的含义,这个问题是专门关于Concatenate的。

根据PEP-612的语法,在Concatenate表达式中不允许使用省略号:

我们现在用两个新选项来扩充它:参数规范变量(Callable[P, int])或参数规范变量的级联(Callable[Concatenate[int, P], int])。

callable ::= Callable "[" parameters_expression, type_expression "]"
parameters_expression ::=
| "..."
| "[" [ type_expression ("," type_expression)* ] "]"
| parameter_specification_variable
| concatenate "["
type_expression ("," type_expression)* ","
parameter_specification_variable
"]"

其中parameter_specification_variabletyping.ParamSpec变量,以上面定义的方式声明,concatenatetyping.Concatenate

然而,对省略号作为连接的最后一个参数的支持是在2022年4月作为Python 3.11的一部分引入的。

不过,似乎没有类型检查器可以处理这个新案例。

相关内容

  • 没有找到相关文章

最新更新