Python TypeVar混乱,如何键入回调函数?
概念是;ParamArray只是一个值的元组。我有一个函数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
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