Сопоставьте вариативные дженерики с их эквивалентом классаPython

Программы на Python
Ответить
Anonymous
 Сопоставьте вариативные дженерики с их эквивалентом класса

Сообщение Anonymous »

Я пытаюсь использовать дженерики с переменным числом вариантов для выражения следующего шаблона: при наличии вариативного списка классов вернуть кортеж экземпляров, типы которых позиционно соответствуют входным классам.
По сути, я хочу, чтобы моя сигнатура функции была именно такой:

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

def foo[*Cs](*classes: type[*Cs]) -> tuple[*Cs]:
return tuple(cls() for cls in classes)
Pylance выдает reportInvalidTypeForm:

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

TypeVarTuple
не допускается в этом контексте

Изображение

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

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

foo(int, int, str) -> tuple[int, int str]
или альтернативно

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

foo(str, str, str)
# > foo(, , ) -> [, , ]
Я уже знаю, как этого можно добиться для функций с «известными» параметрами:

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

def bar[T](cls: type[T]) -> T:
return cls()
Единственная полезная информация, которую я смог найти, — это исходный код этого ECS, целью которого является сделать то же самое, используя множественные переполнения. Хотя это делает код «типобезопасным», оно ограничивает функцию любым количеством написанных для нее переполнений, что затрудняет поддержку и делает ее немасштабируемой:

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

_C = _TypeVar('_C')
_C2 = _TypeVar('_C2')
_C3 = _TypeVar('_C3')
_C4 = _TypeVar('_C4')

@_overload
def get_components(__c1: _Type[_C], __c2: _Type[_C2]) -> _List[_Tuple[int, _Tuple[_C, _C2]]]:
...

@_overload
def get_components(__c1: _Type[_C], __c2: _Type[_C2], __c3: _Type[_C3]) -> _List[_Tuple[int, _Tuple[_C, _C2, _C3]]]:
...

@_overload
def get_components(__c1: _Type[_C], __c2: _Type[_C2], __c3: _Type[_C3], __c4: _Type[_C4]) -> _List[
_Tuple[int, _Tuple[_C, _C2, _C3, _C4]]]:
...

def get_components(*component_types: _Type[_Any]) -> _List[_Tuple[int, _Tuple[_Any, ...]]]:
"""Get an iterator for Entity and multiple Component sets."""
if _cache_dirty:
_clear_cache_now()

cached = _get_components_cache.get(component_types)
if cached is not None:
return cached

result = list(_get_components(*component_types))
_get_components_cache[component_types] = result
return result
Я просмотрел спецификацию, но не нашел ничего полезного.


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

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

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

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

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

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