Как вызывать функции в dict, которые принимают разное количество аргументов? - PullRequest
0 голосов
/ 23 мая 2018

Я хочу иметь dict функций, но некоторые функции принимают больше аргументов, чем другие.

"1":func1, # This takes 0 arguments
"2":func2 # This takes 1 argument `

Я не знаю, как вызвать функцию через dict.Должен ли я иметь if статус или мне чего-то не хватает?

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Сохраните функции в словаре и вызывайте функции с правильным количеством аргументов.Ничего особенного делать не нужно.

def func1():
   print("Function 1 - no args")

def func2(a):
   print("Function 2 got arg", a)

def func3(r, g="green", b="blue"):
   print("Function 3 got %r, %r and %r" % (r,g,b))

d = { "1": func1,
      "2": func2,
      "3": func3 }

d["1"]()
d["2"]("Hello")

Вы можете даже inspect функции в словаре, чтобы получить сигнатуру метода (позиционные аргументы и аргументы ключевых слов, а также значения по умолчанию).

import inspect

f = d["3"]
sig = inspect.signature(f)
ba = sig.bind("red", g="gray")
ba.apply_defaults()
f(*ba.args, **ba.kwargs)

Вывод:

Функция 1 - без аргументов
Функция 2 получила аргумент Hello
Функция 3 получила «красный», «серый» и «синий»

0 голосов
/ 23 мая 2018

Предполагая эту настройку:

def foo():
    print('foo')

def bar(a):
    print('bar %s' % a)

def spam(a, b):
    print('spam %s %s' % (a, b))

functions = dict(foo=foo, bar=bar, spam=spam)

Вот что вы можете сделать:

import inspect

for func in functions.values():
    num_args = len(inspect.signature(func).parameters)
    args = [1, 2, 3]
    func(*args[:num_args])
0 голосов
/ 23 мая 2018
  1. Вы можете заставить все функции принимать список аргументов.

    [arg1, arg2] or [] # empty, etc...
    
  2. Вы также можете сохранить количество аргументов в значениях dict.

    "1": (func1, 0), etc...
    

Затем вы можете вызывать такие функции, как,

dictionary["1"]([arg1, arg2]) # Or with other implementation style you used.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...