Як створити функцію Python з необов'язковими аргументами?


219

У мене є функція 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]

Відповіді:


196

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


246

Просто використовуйте *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


Дякую. Хоча я не можу використати таку велику гнучкість у своєму коді, і це не вирішує мою проблему виклику з різними порожніми отворами в моєму списку, це чудовий інструмент, який можна використовувати в іншому проекті. і Руссел Борогов дав мені точну відповідь, яка мені потрібна для моєї проблеми, я задоволений.
Талія


@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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.