Задать вопрос
@romazhan

Можно ли пропустить первый аргумент по умолчанию в Python?

def total(a = 5, *b):
    print(a)

total(1, 2, 3)


Можно ли не изменяя функцию `total` передать кортеж `(1, 2, 3)` в `b`, чтобы `a` не стало равно 1?
  • Вопрос задан
  • 465 просмотров
Подписаться 3 Простой 5 комментариев
Помогут разобраться в теме Все курсы
  • Нетология
    Python-разработчик: расширенный курс + нейросети
    12 месяцев
    Далее
  • Академия Эдюсон
    Python-разработчик
    9 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Python-разработчик + ИИ
    8 месяцев
    Далее
Решения вопроса 2
aRegius
@aRegius
Python Enthusiast
Как вариант, можете посмотреть в сторону partial

>>> def total(a=5, *b):
       return(a, b)

>>> total_first_fixed = partial(total, 5)

>>> a, b = total_first_fixed(6)
>>> a
5
>>> b
(6,)
>>> a, b = total_first_fixed(1, 2, 3)
>>> a
5
>>> b
(1, 2, 3)
Ответ написан
Комментировать
@kamenyuga
Конечно, это возможно. В питоне можно все, потому что все доступно в любой момент времени. Вопрос только в сложности и обработке всех возможных вариантов. В таких случаях помогает модуль inspect. Но, если до такого дошло в прикладном коде, значит дела идут не важно и не туда.

import inspect

def get_default_args(func):
    signature = inspect.signature(func)
    return {
        k: v.default
        for k, v in signature.parameters.items()
        if v.default is not inspect.Parameter.empty}

def f1(a=5, *b):
    print(a)
    print(b)

if __name__ == '__main__':
    f1(1, 2, 3)
    f1(*get_default_args(f1).values(), 1, 2, 3)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
lxstvayne
@lxstvayne
Люблю Python
Обычно всегда именованные параметры со значением по умолчанию стоят после позиционных. Если спроектировать функцию так, тогда всё работает хорошо:
def total(*b, a=5):
    print(a, b)

Конкретно для данного примера, нельзя обойтись без костыля, чтобы достичь вашей цели.
Ответ написан
@101-s
по-моему нельзя, потому как порядок важен total(a, *b, **с)
a - обязательный аргумент, *b - кортеж аргументов
**с - именованные аргументы (словарь)
сам пользовался этим редко, мне обычно хватает явных аргументов
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Краснодар
от 220 000 до 300 000 ₽
ITK academy Краснодар
от 75 000 ₽
DimaTech Ltd Краснодар
от 140 000 до 140 000 ₽