Введите аннотацию, которая зависит от количества аргументовPython

Программы на Python
Ответить
Anonymous
 Введите аннотацию, которая зависит от количества аргументов

Сообщение Anonymous »

У меня есть функция, которая извлекает информацию о любых переменных и возвращает ее, поэтому ее можно встроить в код без необходимости переписывать еще одну строку. Он определяется следующим образом:

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

from typing import TypeVar

T = TypeVar("T")

def extract_info(var: T) -> T:
# extracting and logging infos on var

return var
так что вы можете просто заменить любую переменную foo на extract_info(foo), не нарушая код, поскольку он не изменяет переменную и возвращает ее как задано.
Теперь я бы обновил свою функцию, чтобы она принимала любую серию переменных, а не только (но хотя бы) одну. Я бы хотел, чтобы новая функция была:

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

def extract_info(var, *other_vars):
# extracting and logging infos on var and other_vars if they exist

all_args = (var, *other_vars)
return all_args[0] if len(all_args) == 1 else all_args
Таким образом его можно легко использовать:

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

# PREVIOUS CODE
x: Any = some_operation()
t: tuple[Any] = some_other_operation()

# NEW CODE
x: Any = extract_info(some_operation())
t: tuple[Any] = some_operation(*some_other_operation())
Проблема связана с аннотациями типов. Размер вывода зависит от размера ввода, а также от типов:
  • если указан только 1 аргумент, тип возвращаемого значения — это тип аргумента.
  • если указаны другие аргументы, тип возвращаемого значения — это кортеж типов аргументов (возможно, неоднородных).
Сначала у меня возникла следующая идея:

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

from typing import TypeVar, TypeVarTuple

T = TypeVar('T')
Ts = TypeVarTuple('Ts')

def extract_info(var: T, *other_vars: tuple[*Ts]) -> tuple[T, *Ts]:
#do the rest...
Но это решение работает только в случае передачи нескольких аргументов.
Есть ли какой-нибудь способ учесть возможное изменение типа? Я мог бы добавить | T добавить конец аннотации возврата, это сработает? Или мой дизайн слишком запутан, чтобы правильно его напечатать?
Ответить

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

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

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

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

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