导入一个模块,然后遍历该模块的名称空间来查找任何函数(您可以假设使用调用()方法的任何对象都是一个函数),并以与在def语句中可能出现的方式相同的方式打印函数及其参数的名称。
我的问题是,在循环了模块并得到所有函数之后,我无法将函数名传递给inspect.getfullargspec(),因为它是一个string.How,我让字符串可以调用吗?
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)发布于 2012-05-20 21:58:24
你在这件事上犯了一些错误。但是,快速的回答是,您不想使字符串可调用,您只需要知道inspect.getmembers返回一个('func_name', <function object>)对列表,inspect.getargspec需要一个函数对象。
所以你可以让你的副循环看起来像这样:
for name, fun in lst:
long_name = r"%s.%s" % (x.__name__, name)
argspec = inspect.getargspec(fun)
print(long_name)作为一个单独的问题,您的变量名称大多是非描述性的,偶尔也不正确。例如,您所称的func_names始终是一个名称,变量lst将更有用地命名为members,而item应该是member。命名函数func通常不是很好的实践,特别是当该函数需要其中的多个变量时,也应该更恰当地命名为func。
发布于 2013-11-25 18:41:01
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])))https://stackoverflow.com/questions/10677358
复制相似问题