Возможно ли в Python ввести функцию, которая использует первые элементы списка аргументов произвольного размера?

У меня есть функция Python, которая извлекает первый элемент произвольного числа *args:

def get_first(*args):
    return tuple(a[0] for a in args)

Допустим, я вызываю эту функцию следующим образом:

b = (1, 2, 3)
c = ("a", "b", "c", "d")
x = get_first(b, c)

Я ожидаю типа Tuple[int, str]. Мне кажется невозможным добиться правильной типизации, чтобы точно выявить этот тип.

Мне не повезло с TypeVarTuplePEP 646 или с Paramspec PEP 612.

Если вы используете v1, v2 = (a[0] for a in args), а затем return (v1, v2), вы получите кортеж (1, 'a'), который вы ожидали.

user19077881 15.05.2024 23:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
1
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Подпись, которую вы ищете, связана с подписью zip; на самом деле, вы можете реализовать свою функцию как next(zip(*args)).

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

        @overload
        def __new__(cls, *, strict: bool = ...) -> zip[Any]: ...
        @overload
        def __new__(cls, iter1: Iterable[_T1], /, *, strict: bool = ...) -> zip[tuple[_T1]]: ...
        @overload
        def __new__(cls, iter1: Iterable[_T1], iter2: Iterable[_T2], /, *, strict: bool = ...) -> zip[tuple[_T1, _T2]]: ...
        @overload
        def __new__(
            cls, iter1: Iterable[_T1], iter2: Iterable[_T2], iter3: Iterable[_T3], /, *, strict: bool = ...
        ) -> zip[tuple[_T1, _T2, _T3]]: ...
        @overload
        def __new__(
            cls, iter1: Iterable[_T1], iter2: Iterable[_T2], iter3: Iterable[_T3], iter4: Iterable[_T4], /, *, strict: bool = ...
        ) -> zip[tuple[_T1, _T2, _T3, _T4]]: ...
        @overload
        def __new__(
            cls,
            iter1: Iterable[_T1],
            iter2: Iterable[_T2],
            iter3: Iterable[_T3],
            iter4: Iterable[_T4],
            iter5: Iterable[_T5],
            /,
            *,
            strict: bool = ...,
        ) -> zip[tuple[_T1, _T2, _T3, _T4, _T5]]: ...
        @overload
        def __new__(
            cls,
            iter1: Iterable[Any],
            iter2: Iterable[Any],
            iter3: Iterable[Any],
            iter4: Iterable[Any],
            iter5: Iterable[Any],
            iter6: Iterable[Any],
            /,
            *iterables: Iterable[Any],
            strict: bool = ...,
        ) -> zip[tuple[Any, ...]]: ...

Этот тип проверяет точно только до шести аргументов, что на практике достаточно хорошо, но является довольно повторяющимся и довольно неуклюжим. К сожалению, это, вероятно, лучшее, что вы можете сделать на данный момент.

С грустью приму ваш замечательный ответ :)

Huub Hoofs 16.05.2024 07:23

Другие вопросы по теме