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

223

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

Ответы:

198

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

Рассел Борогове
источник
246

Просто используйте *argsпараметр, который позволяет вам передавать столько аргументов, сколько вы хотите после своего a,b,c. Вы должны добавить некоторую логику в map 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

шухер
источник
Спасибо. Хотя я не могу использовать такую ​​большую гибкость в своем коде, и это не решает мою проблему вызова с различными пустыми дырами в моем списке, это отличный инструмент для использования в другом проекте. и Рассел Борогове дал мне точный ответ, который мне нужен для моей проблемы, я счастлив.
Талия
12
Это называется Произвольные списки аргументов
FabienB
@Nix, мне очень нравится твой ответ. Однако не могли бы вы уточнить, для чего используется это заявление 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, ...)?
Немо
Если вы беспокоитесь о сложности времени. Это было бы проблемой
NduJay