Как мне создать функцию Python с необязательными аргументами? - PullRequest
129 голосов
/ 03 марта 2012

У меня есть функция Python, которая принимает несколько аргументов.Некоторые из этих аргументов могут быть опущены в некоторых сценариях.

def some_function (self, a, b, c, d = None, e = None, f = None, g = None, h = None):
    #code

Аргументы d - h - это строки, каждый из которых имеет разное значение.Важно, чтобы я мог выбирать, какие необязательные параметры передавать в любой комбинации.Например, (a, b, C, d, e), или (a, b, C, g, h), или (a, b, C, d, e, f, или все они (это мой выбор).

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

Сейчас я отправляю пустые строки вместо первых нескольких отсутствующих аргументов в качестве заполнителей.Я хотел бы иметь возможность вызывать функцию только с использованием фактических значений.

Есть ли способ сделать это?Могу ли я передать список вместо списка аргументов?

Сейчас прототип с использованием ctypes выглядит примерно так:

_fdll.some_function.argtypes = [c_void_p, c_char_p, c_int, c_char_p, c_char_p, c_char_p, c_char_p, c_char_p]

Ответы [ 2 ]

159 голосов
/ 03 марта 2012

Просто используйте параметр * args, который позволяет вам передавать столько аргументов, сколько вы хотите после вашего a,b,c. Вы должны добавить некоторую логику для отображения args-> c, d, e, f, но это «способ» перегрузки.

def myfunc(a,b, *args, **kwargs):
   for ar in args:
      print ar
myfunc(a,b,c,d,e,f)

И это напечатает c,d,e,f


Точно так же вы можете использовать аргумент kwargs и затем назвать свои параметры.

def myfunc(a,b, *args, **kwargs):
      c = kwargs.get('c', None)
      d = kwargs.get('d', None)
      #etc
myfunc(a,b, c='nick', d='dog', ...)

И тогда у kwargs будет словарь всех параметров, имеющих ключевое значение после a,b

128 голосов
/ 03 марта 2012

Попробуйте назвать это как: obj.some_function( '1', 2, '3', g="foo", h="bar" ).После требуемых позиционных аргументов вы можете указать конкретные необязательные аргументы по имени.

...