1

在 Python 中是否可以将函数调用拆分为函数及其参数列表?例如,func(1,4,True)把它变成[func, 1, 4, True]或类似的东西。理想情况下,我想为任意函数执行此操作。

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

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

4

3 回答 3

3

您的问题的直接答案是否定的,因为函数调用不是一个对象,而是一个语句。

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

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

打字dir(funcname)会给你更多的东西去探索。

如果您想知道一个函数是如何工作的,在调用时如何分配参数,以及其他此类调查性故障排除 - 有inspect模块

于 2012-11-15T22:42:45.403 回答
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]

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

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

于 2012-11-15T23:33:47.100 回答
1
call = [func, 1, 4, True]
f,args = call[0],call[1:]
result = f(*args)
于 2012-11-15T22:44:10.857 回答