Код: Выделить всё
from typing import TypeVar, Callable, Sequence, Any
T = TypeVar('T')
def apply(fn: Callable[..., T], vals: Sequence[Any]) -> T:
return fn(*vals)
def f(a: int, b: int) -> int:
return a + b
print(apply(f, (1, 2)))
Код: Выделить всё
from typing import ParamSpec
P = ParamSpec('P')
def apply(fn: Callable[P, T], vals: P) -> T:
return fn(*vals)
< /code>
, которая дает эту ошибку: < /p>
tst_apply.py:6: error: Invalid location for ParamSpec "P" [valid-type]
tst_apply.py:6: note: You can use ParamSpec as the first argument to Callable, e.g., "Callable[P, int]"
tst_apply.py:7: error: Too few arguments [call-arg]
Found 2 errors in 1 file (checked 1 source file)
< /code>
[h4] 2. Использование paramspec.args
Код: Выделить всё
from typing import ParamSpec
P = ParamSpec('P')
def apply(fn: Callable[P, T], vals: P.args) -> T:
return fn(*vals)
< /code>
, которая дает эту ошибку: < /p>
tst_apply.py:7: error: Too few arguments [call-arg]
Found 1 error in 1 file (checked 1 source file)
< /code>
[h4] 3. Используя TypeVartuple
Несмотря на то, что typevartuple доступен только от Python-3.11, я могу импортировать его из typing_extensions , но это все еще не работает - это работает, когда я меняю Vals: *ts на *vals: *ts Но это непригодно для меня:
Код: Выделить всё
Ts = TypeVarTuple('Ts')
def apply(fn: Callable[[*Ts], T], vals: *Ts) -> T:
return fn(*vals)
< /code>
, которая дает эту ошибку: < /p>
tst_apply.py:7: error: invalid syntax [syntax]
def apply(fn: Callable[[*Ts], T], vals: *Ts) -> T:
^
Found 1 error in 1 file (errors prevented further checking)
< /code>
[h4] 4. Использование Tuple [*ts]
Код: Выделить всё
def apply(fn: Callable[[*Ts], T], vals: Tuple[*Ts]) -> T:
return fn(*vals)
< /code>
, которая дает эту ошибку: < /p>
tst_apply.py:7: error: invalid syntax. Perhaps you forgot a comma? [syntax]
def apply(fn: Callable[[*Ts], T], vals: Tuple[*Ts]) -> T:
^
Found 1 error in 1 file (errors prevented further checking)
Есть ли способ аннотировать это, поэтому соединение между параметрами fn и vals не потеряно ?
Подробнее здесь: https://stackoverflow.com/questions/793 ... y-function