繁体   English   中英

Python函数-不知道需要多少个参数时如何动态调用函数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM