【问题标题】:TypeVar confusion, how to type callback functions?TypeVar 混乱,如何键入回调函数?
【发布时间】:2021-05-16 02:01:18
【问题描述】:
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

【问题讨论】:

  • 您是否尝试过使用函数:collections.namedtuple() 完成您的任务?

标签: python mypy python-typing


【解决方案1】:

首先,由于ab 将在range 对象中使用,它们应该是int 而不是浮动的。 step=也应该是int,所以delta也必须是int

看到这个帖子:click

TypeVar 是您可以在类型签名中使用的变量,因此您可以 多次引用相同的未指定类型,而 NewType 是 用于告诉类型检查器某些值应被视为 他们自己的类型。

您遇到的错误是因为您在 TypeVar 中不能有一个约束,在您的情况下是单个 Tuple

实际上,您希望 func 的参数是 Tuple 的实例(或 Tuple 的子类),然后 args 参数是完全相同的元组。这可以使用TypeVar 中的bound= 参数来完成。

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 传递整数元组来测试相反的情况,他没有抱怨。那是因为整数也是类型提示中的浮点数)。

【讨论】:

    猜你喜欢
    • 2021-03-30
    • 2011-02-13
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    相关资源
    最近更新 更多