Python - 将函数调用分解为函数和参数

时间:2012-11-15 22:38:26

标签: python arguments function-call

在Python中是否可以将函数调用拆分为函数及其参数列表?例如,取func(1,4,True)并将其转换为[func, 1, 4, True]或类似内容。理想情况下,我想为任意函数执行此操作。

编辑:我是编程课程的助教,其目的是检查学生在代码中包含哪些测试用例。我想看看学生称他们的代码为什么值,以确保他们正确地测试它。我们让学生在编写测试时使用比较函数(从模块导入),所以我希望编辑比较函数以检查它们包含哪些测试用例。

我对如何实现相同的最终结果有一些其他想法(例如以文本形式阅读代码或将学生代码复制到具有不同func定义的新文件),但是与重新定义比较函数相比,两者都会涉及更多的工作并且有更多的潜在问题。

3 个答案:

答案 0 :(得分:3)

您问题的直接答案是,因为函数调用不是对象,而是声明。

要获取有关任何函数的信息,例如其名称,参数等,您可以使用附加到每个函数的一些属性和方法:

>>> def foo(a,b):
...    print a,b
... 
>>> foo.func_name
'foo'
>>> foo.func_code.co_varnames
('a', 'b')

键入dir(funcname)会为您提供更多可供探索的内容。

如果您想知道函数的工作方式,调用时如何分配参数,以及其他此类调查疑难解答,还有inspect module

答案 1 :(得分:2)

如何定义装饰器:

def func_call_decorator(func):
    def _wrapper(*args, **kwargs):
        ret = func(*args, **kwargs)
        return [func]+list(args)+kwargs.items() + [ret]
    return _wrapper

@func_call_decorator
def foo(a,b):
    return a+b

print foo(2,3)

产生:

[<function foo at 0x10045f5f0>, 2, 3, 5]

我还将给定参数的函数的返回值附加为列表的最后一个元素。

我想知道你的用例是什么......

答案 2 :(得分:1)

call = [func, 1, 4, True]
f,args = call[0],call[1:]
result = f(*args)