[英]Python Functions - how can I dynamically call a function when I don't know how many arguments it expects?
我想在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)
我要这样做正确吗? (我基本上是在编写单元测试,而第一个检查只是简单地确定函数是否返回正确类型的对象,而与调用它们的参数无关。)
您可以使用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,))
用任意参数调用您一无所知的函数是否有意义是一个不同的问题...
您的方法从根本上来说是有缺陷的。 如果仔细编写,函数将通过引发TypeError
或断言来拒绝无效类型的参数。 如果失败,他们将尝试访问参数上的属性或方法,并立即获得AttributeError
。
避免编写对测试功能有所了解的单元测试是徒劳的。
您可以使用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()
将允许您inspect.isgeneratorfunction()
进行测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.