引用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没有提到。这只是一个错误,是Callable
和Concatenate
混合在一起的结果吗?
这个问题在某种程度上是相关的,并显示了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_variable
是typing.ParamSpec
变量,以上面定义的方式声明,concatenate
是typing.Concatenate
。
然而,对省略号作为连接的最后一个参数的支持是在2022年4月作为Python 3.11的一部分引入的。
不过,似乎没有类型检查器可以处理这个新案例。