Ответ 1
Попробуйте вызвать его так: obj.some_function( '1', 2, '3', g="foo", h="bar" )
. После необходимых позиционных аргументов вы можете указать конкретные необязательные аргументы по имени.
У меня есть функция 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]
Попробуйте вызвать его так: obj.some_function( '1', 2, '3', g="foo", h="bar" )
. После необходимых позиционных аргументов вы можете указать конкретные необязательные аргументы по имени.
Просто используйте параметр * 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