python inspect.getargspect
导入一个模块,然后遍历该模块的名称空间以查找任何函数(您可以假定具有调用()方法的任何对象都是函数),并以与def语句中显示的相同方式打印函数及其参数的名称 我的问题是在我循环模块并获得所有函数后,我无法将函数名传递给inspect.getfullargspec(),因为它是一个字符串。如何使该字符串可调用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
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:我不知道我在想什么:-)