@romazhan

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

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

total(1, 2, 3)


Можно ли не изменяя функцию `total` передать кортеж `(1, 2, 3)` в `b`, чтобы `a` не стало равно 1?
  • Вопрос задан
  • 390 просмотров
Решения вопроса 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 - кортеж аргументов
**с - именованные аргументы (словарь)
сам пользовался этим редко, мне обычно хватает явных аргументов
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
24 нояб. 2024, в 18:08
1000 руб./за проект
24 нояб. 2024, в 17:52
3000 руб./за проект
24 нояб. 2024, в 16:14
1000 руб./за проект