2012-07-17 77 views
1

我有一个Python脚本,它创建了自己的函数的字典,我希望它通过使用YARP读取函数名称和参数来执行它们(YARP的知识与这个问题虽然)。使用检查将参数传递给Python中的函数

我创建了一个名为“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的新手,我查看了文档和各种网站 - 我找不到解决方案。我尝试过创建参数元组,但是这不起作用,因为它最终将整个元组作为一个参数传递。

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

回答

1

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

你要找的魔法就是*。应用此列表然后解压缩的项目到你的函数的参数字段:

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

print myfunc(*a) 

退房**为字典

+0

完美,非常感谢! – MxB 2012-07-17 10:35:12

0

这是一个有点奇怪有这种混合结构:

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

那岂不是更自然有单独比特的信息?

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

的,你可以做

methods[func_name](*args) 

(通常情况下,我不会的功能名称绑定到一个变量,但最好功能本身。)

+0

前一种方法看起来像口齿不清给我同样的做法 - 并没有什么错接着就,随即。 – 2012-07-17 10:35:30

+0

这很奇怪,并不完全是我的程序中的结构 - 我只是为了简化示例而放置了一个列表。实际的程序使用YARP使用的“Bottle”对象。 – MxB 2012-07-17 10:36:28

+0

另外,谢谢你的回复,因为*是我失踪的! :-) – MxB 2012-07-17 10:36:57