1

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

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

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

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

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

4

2 回答 2

2

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

您正在寻找的魔法是 *. 将此应用于您的列表,并将项目解压缩到函数的参数字段中:

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

print myfunc(*a)

查看 ** 以获取与 dict 相同的方法

于 2012-07-17T10:32:45.107 回答
0

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

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

拥有两个独立的信息不是更自然吗?

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

你可以做的

methods[func_name](*args)

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

于 2012-07-17T10:32:00.340 回答