У меня есть функция 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
. Вы должны добавить некоторую логику в mapargs
->c,d,e,f
но это «способ» перегрузки.И это будет печатать значения
c,d,e,f
Точно так же вы можете использовать
kwargs
аргумент и затем назвать свои параметры.И тогда
kwargs
будет иметь словарь всех параметров, которые имеют ключевое значение послеa,b
источник
c = kwargs.get('c', None)
? Требуется ли это в каждой функции, имеющей необязательные аргументы? В вашем коде у вас было только 2 необязательных аргумента. Что, если пользователь хочет, чтобы другой аргумент сказалe
? Как я могу изменить ваш пример кода для любого неизвестного числа необязательных аргументов, напримерdef my_func(a, b, *args, **kwagars): obj = <do something with a & b> obj.add(c) obj.add(d) continue obj.add(for e, f, g...)
:? Должен ли я включить,c = kwargs.get('c', None) etc
прежде чем делатьobj.add(c, d, ...)
?