Правильная аннотация для функции «Применить»Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Правильная аннотация для функции «Применить»

Сообщение Anonymous »

В Python-3.10 (это должна быть эта версия) Я хочу добавить лучшую аннотацию для моей функции Apply :

Код: Выделить всё

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)))
Поскольку в этом коде аннотация типа «скрывает» соединение между vals и fn аргументы, поэтому Mypy не может проверить типы и Количество аргументов правильно. Использование paramspec

Код: Выделить всё

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 
[/h4]

Код: Выделить всё

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 
, как это было предложено в Daraan's Repision Revision 1: [/h4]
Несмотря на то, что 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] 
для typevartuple : [/h4]

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Какова правильная сопоставленная аннотация для `JSON` в версии SQLAlchemy 2.x?
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Какова правильная аннотация типа для *args в «discord.py — app_commands»?
    Anonymous » » в форуме Python
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Какова правильная аннотация типа для *args в «discord.py — app_commands»?
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Какова правильная аннотация типа для *args в «discord.py — app_commands»?
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Эта функция правильная? Вызов функции с замыканием (swift — iOS)
    Anonymous » » в форуме IOS
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»