0

导入一个模块,然后通过模块的命名空间查找任何函数(您可以假设任何具有call () 方法的对象都是一个函数)并打印函数的名称及其参数,就像它可能出现在def 语句。

我的问题是在我遍历模块并获得所有函数后,我无法将函数名称传递给 inspect.getfullargspec() 因为它是一个字符串。如何使字符串可调用?

import inspect
from smtplib import SMTP
from pprint import pprint
def func(x):     
    for item in inspect.getmembers(x):
         lst = inspect.getmembers(x, inspect.isfunction)
         for items in lst:
              func_names = items[0] #names of functions               
              f = r"%s.%s" % (x.__name__, func_names)
              arg = inspect.getargspec(f)
              print(f)



if __name__ == '__main__':
     func(SMTP)
4

2 回答 2

2

你在这方面有一些错误。不过,快速的答案是您不想让字符串可调用,您只需要知道它inspect.getmembers返回一个('func_name', <function object>)对列表,并inspect.getargspec期望一个函数对象。

所以你可以让你的 for 循环看起来像这样:

for name, fun in lst:
    long_name = r"%s.%s" % (x.__name__, name)
    argspec = inspect.getargspec(fun)
    print(long_name)

作为一个单独的问题,您的变量名称大多是非描述性的,有时是不正确的。例如,您所调用func_names的始终是一个名称,而变量lst命名为 更有用membersitem应该是member。命名一个函数func通常不是好的做法,特别是当该函数需要其中的多个变量时,更合适的是,命名为func

于 2012-05-20T21:58:24.130 回答
0

lst 这里是一个函数名和函数对象的元组,你真的不需要做所有的字符串操作。下面的简单方法将完成这项工作:

def func(module):
    for lst in inspect.getmembers(module, inspect.isfunction):
        if inspect.isfunction(lst[1]):# Doing an additional check, may not be actually required
            print(lst[0]+inspect.formatargspec(*inspect.getfullargspec(lst[1])))
于 2013-11-25T18:41:01.287 回答