python - TypeVar 的困惑,如何键入回调函数?
问题描述
from typing import Tuple, TypeVar, Any
ParamArray = TypeVar("ParamArray", Tuple[Any, ...])
这个概念是;ParamArray 只是一个值的元组。我有一个功能
def integrate(func, a, b, args=()):
delta = 0.1
running_total = 0.
for x in range(a, b, step=delta):
running_total += func(x, args) * delta
return running_total
因此,我试图输入它:
def integrate(func:Callable[[float, ParamArray], float], a: float, b: float, args: ParamArray=()) -> float:
尝试传达 args ParamArray 与传递给 func 的事实相同,因此回调必须能够接受传递的任何参数。
我遇到了一些错误
TypeVar cannot have only a single constraint Argument 2 to "TypeVar" has incompatible type "object"; expected "Type[Any]" Variable "typealiases.ParamArray" is not valid as a type
解决方案
首先,因为a
和b
将在range
对象中使用,它们不应该是int
浮动的。也step=
应该int
如此,所以delta
也必须如此int
。
看到这个帖子:点击
TypeVar 是可以在类型签名中使用的变量,因此您可以多次引用相同的未指定类型,而 NewType 用于告诉类型检查器某些值应被视为它们自己的类型。
您得到的错误是因为您在 TypeVar 中不能有一个约束,在您的情况下是单个Tuple
.
实际上,您希望您的参数是某物func
的实例(或 的子类),然后参数是完全相同的元组。这可以使用in 中的参数来完成。Tuple
Tuple
args
bound=
TypeVar
from typing import Tuple, TypeVar, Any, Callable
ParamArray = TypeVar("ParamArray", bound=Tuple[Any, Any])
def integrate(func: Callable[[ParamArray], float], a: int, b: int,
args: ParamArray = ()) -> float:
delta = 1
running_total = 0.
for x in range(a, b, step=delta):
running_total += func(x, args) * delta
return running_total
def fn1(t: Tuple[int, int]) -> float:
pass
def fn2(t: Tuple[float, float]) -> float:
pass
integrate(fn1, 10, 20, (1, 2)) #valid
integrate(fn2, 10, 20, (1.1, 2.2)) #valid
integrate(fn1, 10, 20, (1.1, 2.2)) #invalid
现在在第三种情况下,您可以看到因为fn1
需要整数元组并且我们将浮点数元组传递给args
参数,所以它会抱怨。(我知道您将fn2
通过传递整数元组来测试相反的情况,他不会抱怨。那是因为整数也是类型提示中的浮点数)。
推荐阅读
- python - AttributeError:“成员”对象没有属性“通道”
- amazon-s3 - 如何知道lambda图像压缩是否完成?
- aws-api-gateway - 如何在 AWS Gateway API 中控制用户对路由的访问
- python - 在 python 中使用 webbrowser 模块打开网站时出错
- nginx - 将子域添加到现有的 nginx 域配置?
- php - 去除字符串中与PHP中字母、数字、特定符号、汉字不匹配的字符
- python - 在 django 的模型中保存用户的其他详细信息时出错
- javascript - Redux 表单自定义道具 FieldArray 与 Typecript
- react-native - 如何在 headerRight Press 上调用另一个组件中存在的函数函数
- testing - 如何对 Ken Burns 效果进行仪器测试?