如何从另一种类型构建一个类型并使 mypy 检查工作

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

我正在使用 Python 的类型提示系统,并尝试为类似于现有函数类型的函数创建类型别名,但带有一个附加参数。这是我尝试过的:

from typing import Callable

# Original function type
RK_function = Callable[[float, int], int]

# Attempted new function type with an additional int argument
RK_functionBIS = Callable[[*RK_function.__args__[:-1], int], int]

我期望 RK_functionBIS 表示 Callable[[float, int, int], int],它在直接运行时会执行此操作,而无需使用 mypy 检查它。但是,当我运行 mypy 进行类型检查时,出现以下错误: 文字

错误:无效类型别名:表达式不是有效类型 [有效类型] Q

python python-typing mypy
1个回答
0
投票

截至目前,Python 不支持直接提取

Callable
别名的参数以在其他类型中使用。但是,如果您的代码片段代表了您正在解决的问题,那么您的
RK_function
看起来完全由 仅位置参数 组成,因此您至少可以重构参数部分。请参阅mypy Playground

from collections.abc import Callable
from typing_extensions import Unpack, TypeAliasType

RK_function_args = TypeAliasType("RK_function_args", tuple[float, int])

# Original function type
RK_function = TypeAliasType("RK_function", Callable[[Unpack[RK_function_args]], int])

# Attempted new function type with an additional int argument
RK_functionBIS = TypeAliasType("RK_functionBIS", Callable[[Unpack[RK_function_args], int], int])
>>> bis: RK_functionBIS
>>> res: int = bis(1.0, 2, 3)  # OK
>>> bis("1.0", 2, 3)           # Error: first argument should be float
>>> bis(1.0, 2)                # Error: not enough arguments
© www.soinside.com 2019 - 2024. All rights reserved.