Рассмотрим следующую функцию, которая не работает в Python, но я буду использовать для объясните, что мне нужно сделать.
def exampleFunction(a, b, c = a):
...function body...
То есть я хочу присвоить переменной c
то же значение, что и переменная a
, если не указано альтернативное значение. Приведенный выше код не работает в Python. Есть ли способ сделать это?
Спасибо.
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
было в точности тем фиктивным объектом, который вы создали там.
Этот общий шаблон, вероятно, является лучшим и наиболее читаемым:
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
Один из подходов выглядит примерно так:
def foo(a, b, c=None):
c = a if c is None else c
# do something