python inspect.getargspect

python inspect.getargspect,python,module,inspect,Python,Module,Inspect,导入一个模块,然后遍历该模块的名称空间以查找任何函数(您可以假定具有调用()方法的任何对象都是函数),并以与def语句中显示的相同方式打印函数及其参数的名称 我的问题是在我循环模块并获得所有函数后,我无法将函数名传递给inspect.getfullargspec(),因为它是一个字符串。如何使该字符串可调用 import inspect from smtplib import SMTP from pprint import pprint def func(x): for ite

导入一个模块,然后遍历该模块的名称空间以查找任何函数(您可以假定具有调用()方法的任何对象都是函数),并以与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)

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

因此,您可以使for循环如下所示:

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

另一个问题是,可变名称大多是非描述性的,有时也不正确。例如,您所称的
func_name
始终是一个名称,而变量
lst
的名称将更有效地命名为
members
,而
item
应该是
member
。命名函数
func
通常不是一种好的做法,尤其是当该函数需要几个变量时,更合适的做法是将其命名为
func
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])))

更妙的是,让for循环为您完成赋值:
for name,func in lst:
@Matthew:我不知道我在想什么:-)