如何在dict中调用带有不同数量参数的函数?

时间:2018-05-23 20:18:53

标签: python function

我想拥有dict个函数,但有些函数比其他函数需要更多参数。

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

我不知道如何通过dict调用该函数。我应该有一个if的陈述,还是我缺少的东西?

3 个答案:

答案 0 :(得分:2)

假设这样设置:

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])

答案 1 :(得分:0)

  1. 您可以使所有函数都包含参数列表。

    [arg1, arg2] or [] # empty, etc...
    
  2. 您还可以在dict值中存储参数数量。

    "1": (func1, 0), etc...
    
  3. 然后你可以调用像

    这样的函数
    dictionary["1"]([arg1, arg2]) # Or with other implementation style you used.
    

答案 2 :(得分:0)

将函数存储在字典中,并使用正确数量的参数调用函数。没有什么特别需要做的。

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 - 没有args
  功能2得到arg Hello
  功能3得到了红色'灰色'和'蓝色'