0

我想在 python 中编写一个动态读取模块并创建该模块中所有函数的列表的方法。然后我想遍历这个列表并调用每个函数。到目前为止,我有以下代码:

import mymodule
from inspect import getmembers, isfunction

def call_the_functions():
    functions_list = [f for f in getmembers(mymodule) if isfunction(f[1])]
    for f in functions_list:
        result = f()

我的问题是我的程序崩溃了,因为某些函数需要参数。我想做类似以下的事情,但不知道如何:

for f in functions_list:
    args = [""] * f.expectedNumberOfArguments()
    result = f(*args)

我会以正确的方式解决这个问题吗?(我基本上是在写一个单元测试,第一个检查就是函数返回一个正确类型的对象,不管它们被调用的参数是什么。)

4

3 回答 3

3

你可以使用inspect.getargspec()

In [17]: def f(x, z=2, *args, **kwargs): pass

In [18]: inspect.getargspec(f)
Out[18]: ArgSpec(args=['x', 'z'], varargs='args', keywords='kwargs', defaults=(2,))

用任意参数调用你一无所知的函数是否有意义是一个不同的问题......

于 2012-12-06T19:43:20.520 回答
3

你的方法从根本上是有缺陷的。如果仔细编写,函数将通过引发TypeError或断言来拒绝无效类型的参数。如果做不到这一点,他们将尝试访问参数上的属性或方法并立即获得一个AttributeError.

试图避免编写对正在测试的函数有所了解的单元测试是徒劳的。

于 2012-12-06T19:48:09.193 回答
1

您可以使用inspect模块和getargspec. 这是一个简单的例子:

import inspect

def myfunc(x): 
    return x * 2 

print inspect.getargspec(myfunc);

给出:

ArgSpec(args=['x'], varargs=None, keywords=None, defaults=None)

某些函数可能是生成器,因此您调用它们的测试策略可能不会给您期望的结果, inspect.isgeneratorfunction()这将允许您对此进行测试。

于 2012-12-06T19:49:31.320 回答