使用inspect将参数传递给Python中的函数

时间:2012-07-17 10:25:10

标签: python reflection introspection inspect

我有一个Python脚本,它创建了自己的函数字典,我希望它通过使用YARP读取函数名和参数来执行它们(YARP的知识虽然与此问题无关)。

我创建一个名为“inc”的字符串列表,该列表由进入程序的值填充。第一项是函数名,列表中的任何其他字符串都是参数。我创建了一个名为“methods”的字典,其中键是函数名称,值是对函数对象的引用(使用inspect模块)。我将函数的返回值存储在变量“result”中。

下面的代码段显示了我目前使用的简化版本,它工作正常,但无法处理具有多个参数的函数。为了避免这种情况,如果函数需要更多参数,我会使用一个列表:

if len(inc) == 1:
    result = methods[inc[0]]()   # call method with 0 arguments

elif len(inc) == 2:
    result = methods[inc[0]](inc[1])    # call method passing a string

else:
    args = []
    result = methods(inc[0])(inc[1:])    # call method passing a list

理想情况下,我想改变它,以便我的函数可以有任意数量的参数,但我无法弄清楚我是如何做到这一点的。我是Python的新手,我查看了文档和各种网站 - 我找不到解决方案。我已经尝试过创建参数元组之类的东西,但这不起作用,因为它最终将整个元组作为一个参数传递。

是否有更好的解决方案来解决这个问题,比如创建某种表示一组参数并将其传递给函数的对象?任何建议将不胜感激!

2 个答案:

答案 0 :(得分:2)

您应该查看https://stackoverflow.com/a/3394898/1395668

你正在寻找的魔力是*。将其应用于列表,并将项目解压缩到函数的参数字段中:

a = [ 1, 2, 3]
def myfunc(a, b, c):
    return a + b + c

print myfunc(*a)

检查**以获得与dict相同的方法

答案 1 :(得分:0)

拥有这种混合结构有点奇怪:

inc = [func_name, arg1, arg2, ...]

两个分开的信息位更自然吗?

func_name = ...
args = [arg1, arg2, ...]

你可以做到

methods[func_name](*args)

(通常,我不会将函数名称绑定到变量,但最好是函数本身。)