Подтвердить что ты не робот

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

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

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

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

Спасибо.

4b9b3361

Ответ 1

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 is missing быть истинным - это для c именно тот фиктивный объект, который вы там создали.

Ответ 2

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

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

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

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

def example(a, b, *args, **kwargs):
    if 'c' in kwargs:
        c = kwargs['c']
    elif len(args) > 0:
        c = args[0]
    else:
        c = a

Ответ 3

Один подход - это что-то вроде:

def foo(a, b, c=None):
    c = a if c is None else c
    # do something