Логика отображения с помощью TypeVarTuplePython

Программы на Python
Ответить
Anonymous
 Логика отображения с помощью TypeVarTuple

Сообщение Anonymous »

У меня довольно простая функция, которая принимает последовательность классов и возвращает кортеж их соответствующих экземпляров: < /p>

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

def f(*classes):
return tuple(cls() for cls in classes)
< /code>
Есть ли способ аннотировать его, чтобы Mypy (и, что более важно, Intellisense) понимал это отношение? Например: < /p>
a, b, c = f(A, B, C)
# reveal_type(a) is A
# reveal_type(b) is B
# reveal_type(c) is C
Я чувствую, что typevartuple - это шаг в правильном направлении, но я изо всех сил пытаюсь ввести логику типа [] , которая заставит ее работать. Как в: < /p>

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

def f[*Ts](
*classes: type[*Ts] # this; as in, tuple[type[T] for T in Ts]
) -> tuple[*Ts]:
return tuple(cls() for cls in classes)
type [*ts] бит не работает (

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

Unpack is only valid in a variadic position
), и я не могу выяснить, как (или, возможно, это даже возможно) правильно выразить мою логику печати в этом случае.
edit < Br /> Пока что единственное решение, которое я мог бы придумать,-это что-то вроде: < /p>

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

@overload
def f[T1](cls1: type[T1]) -> tuple[T1]: ...

@overload
def f[T1, T2](cls1: type[T1], cls2: type[T2]) -> tuple[T1, T2]: ...

@overload
def f[T1, T2, T3](cls1: type[T1], cls2: type[T2], cls3: type[T3]) -> tuple[T1, T2, T3]: ...

# 10 suchoverloads, assuming nobody is going to call the function with 11 classes or more...
Но это... сами понимаете. Публикую его для справки, на случай, если другие столкнутся с чем-то подобным и не найдут лучшего решения.


Подробнее здесь: https://stackoverflow.com/questions/793 ... pevartuple
Ответить

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

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

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

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

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