Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python TypeVar混乱,如何键入回调函数?_Python_Mypy_Python Typing - Fatal编程技术网

Python TypeVar混乱,如何键入回调函数?

Python TypeVar混乱,如何键入回调函数?,python,mypy,python-typing,Python,Mypy,Python Typing,概念是;ParamArray只是一个值的元组。我有一个函数 from typing import Tuple, TypeVar, Any ParamArray = TypeVar("ParamArray", Tuple[Any, ...]) 因此,我尝试键入: def integrate(func, a, b, args=()): delta = 0.1 running_total = 0. for x in range(a, b, step=de

概念是;ParamArray只是一个值的元组。我有一个函数

from typing import Tuple, TypeVar, Any

ParamArray = TypeVar("ParamArray", Tuple[Any, ...])
因此,我尝试键入:

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
尝试传达这样一个事实,即args ParamArray与传递给func的是同一个对象,因此回调必须能够接受传递的任何args

我有一些错误

首先,由于a和b将在range对象中使用,它们应该是int而不是float。而且step=也应该是int,所以delta也必须是int

见此帖:

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

您得到的错误是因为在TypeVar中不能有一个约束,在您的例子中是一个元组

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


现在在第三种情况下,您可以看到,因为fn1接受整数的元组,我们将浮点元组传递给args参数,它抱怨道。我知道你会用fn2传递整数元组来测试相反的情况,他不会抱怨。这是因为整数在类型提示中也是浮点。

您是否尝试过使用函数:collections.namedtuple执行任务?
def integrate(func:Callable[[float, ParamArray], float], a: float, b: float, args: ParamArray=()) -> float:
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
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