Как создать функцию Python с дополнительными аргументами?

У меня есть функция 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]

Ответ 1

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

Ответ 2

Просто используйте параметр * 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