Python. Обязательные, не обязательные аргументы функции

допустим есть функция:

def func(a=None, b):
    return b

Как я могу запустить функцию, вводя только параметр b? При запуске данного кода func(2), где 2 я хочу записать на место b.


Ответы (4 шт):

Автор решения: Gh0sTG0

Сначала идут все обязательные аргументы (те которые без =None, просто буквами/названиями, к примеру (a, very_usefull_argument), и.т.п.), потом идут те аргументы которые можно не вводить. Т.е. в твоей задаче это будет как:

def func(b, a=None):
    return b


t = func(5)
print(t)  #выведет 5
→ Ссылка
Автор решения: CrazyElf

Именно так функцию нельзя записать, будет синтаксическая ошибка - именованные параметры должны идти после позиционных.

Но в целом можно сделать как-то так, хотя это и изврат какой-то на вид:

def func(a, b):
    return b

def func2(b):
    return func_(None, b)

func_ = func
func = func2
func(2)

Наверное, можно и декоратор сделать, чтобы более красиво, но это надо подумать.

→ Ссылка
Автор решения: Sergei Malanin

Сначала идут обязательные параметры которые перечисляются литерами, потом не обязательные, у них после литеры идет =

def func(b, a="'some value or None'"):
    print(b, a)
    return b

print(func(1))
print(func(1, "'another value'"))

Вот так работать будет.

→ Ссылка
Автор решения: Andy Pavlov

Как уже написал Gh0sTG0, если аргументы вводятся в виде значений, то важен порядок.

Ваш исходный вариант:

def func(a=None, b):
    return b

будет выдавать SyntaxError: non-default argument follows default argument. Для интерпретатора важен порядок, чтобы переменные без значений по-умолчанию шли перед переменными с дефолтными значениями.

Другой момент, когда у нас очередность соблюдена, а мы в функции задаем переменные через присваивание. Все три варианта будут отработаны:

def func1(a, b):
    print(a, b)

def func2(a=None, b=None):
    print(a, b)

def func3(a, b=None):
    print(a, b)

func1(b=10, a=15)
func2(b=10, a=15)
func3(b=10, a=15)

С учетом этого в вашем случае можно, к примеру, задать все переменные со значениями по-умолчанию

def func(a=None, b=None)

а потом вызывать

func(b=10)
→ Ссылка