Установка значения по умолчанию для входа функции, равного другому входу в Python

Рассмотрим следующую функцию, которая не работает в Python, но я буду использовать для объясните, что мне нужно сделать.

def exampleFunction(a, b, c = a):
    ...function body...

То есть я хочу присвоить переменной c то же значение, что и переменная a , если не указано альтернативное значение. Приведенный выше код не работает в Python. Есть ли способ сделать это?

Спасибо.

21
задан Nick T 21 August 2010 в 05:37
поделиться

3 ответа

def example(a, b, c=None):
    if c is None:
        c = a
    ...

Значение по умолчанию для аргумента ключевого слова не может быть переменной (если это так, оно преобразуется в фиксированное значение при определении функции). Обычно используется для передачи аргументов в основную функцию. :

def main(argv=None):
    if argv is None:
        argv = sys.argv

Если None может быть допустимым значением, решение состоит в том, чтобы либо использовать магию * args / ** kwargs , как в ответе Карла, либо использовать дозорный объект . Библиотеки, которые делают это, включают attrs и Marshmallow , и, на мой взгляд, он намного чище и, вероятно, быстрее.

missing = object()

def example(a, b, c=missing):
    if c is missing:
        c = a
    ...

Единственный способ для c отсутствует , чтобы быть истинным, - это чтобы c было в точности тем фиктивным объектом, который вы создали там.

29
ответ дан 29 November 2019 в 20:20
поделиться

Этот общий шаблон, вероятно, является лучшим и наиболее читаемым:

def exampleFunction(a, b, c = None):
    if c is None:
        c = a
    ...

Вы должны быть осторожны, чтобы None не было допустимым состоянием для c .

Если вы хотите поддерживать значения «None», вы можете сделать что-то вроде этого:

def example(a, b, *args, **kwargs):
    if 'c' in kwargs:
        c = kwargs['c']
    elif len(args) > 0:
        c = args[0]
    else:
        c = a
15
ответ дан 29 November 2019 в 20:20
поделиться

Один из подходов выглядит примерно так:

def foo(a, b, c=None):
    c = a if c is None else c
    # do something
1
ответ дан 29 November 2019 в 20:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: