How to list all functions in a Python module?
我的系统上安装了一个python模块,我想知道其中有哪些函数/类/方法可用。
我想调用每个函数的Doc函数。在Ruby中,我可以做一些类似classname.methods的事情来获取该类上所有可用方法的列表。在python中有类似的东西吗?
比如:
1 2 | from somemodule import foo print foo.methods # or whatever is the correct method to call |
您可以使用
一旦你完成了模块的设计,你就可以:
1 | help(modulename) |
…以交互方式同时获取所有功能的文档。或者你可以使用:
1 | dir(modulename) |
…只需列出模块中定义的所有函数和变量的名称。
检查模块。另请参阅
带inspect的示例:
1 2 3 4 | from inspect import getmembers, isfunction from my_project import my_module functions_list = [o for o in getmembers(my_module) if isfunction(o[1])] |
getmembers返回(object_name,object_type)元组的列表。
您可以将isfunction替换为inspect模块中的任何其他isxxx函数。
1 2 3 4 5 | import types import yourmodule print([getattr(yourmodule, a) for a in dir(yourmodule) if isinstance(getattr(yourmodule, a), types.FunctionType)]) |
为了完整性起见,我想指出,有时您可能希望解析代码而不是导入代码。
例如,我允许用户为使用zippapp制作的包选择入口点函数。使用
相反,我使用ast模块列出所有顶级功能:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import ast import sys def top_level_functions(body): return (f for f in body if isinstance(f, ast.FunctionDef)) def parse_ast(filename): with open(filename,"rt") as file: return ast.parse(file.read(), filename=filename) if __name__ =="__main__": for filename in sys.argv[1:]: print(filename) tree = parse_ast(filename) for func in top_level_functions(tree.body): print(" %s" % func.name) |
将此代码放入
1 2 3 4 | $ python list.py list.py list.py top_level_functions parse_ast |
当然,导航一个AST有时会很困难,即使对于像Python这样的相对简单的语言,因为AST的级别非常低。但是,如果您有一个简单而清晰的用例,那么它既可行又安全。
不过,缺点是您无法检测运行时生成的函数,如
这将起到关键作用:
1 | dir(module) |
但是,如果您觉得阅读返回的列表很烦人,只需使用下面的循环来获得每行一个名称。
1 | for i in dir(module): print i |
对于您不希望解析的代码,我建议使用上面的@csl基于ast的方法。
对于其他所有问题,检查模块都是正确的:
1 2 3 4 5 | import inspect import <module_to_inspect> as module functions = inspect.getmembers(module, inspect.isfunction) |
这给出了一个形式为
上面的简单答案在各种回答和评论中都有所暗示,但没有明确指出。
但是,使用类似ipython的交互式python shell,您可以使用tab completion获得模块中定义的所有对象的概述。这比使用脚本和
module. 将显示模块中定义的所有对象(函数、类等)module.ClassX. 将向您显示类的方法和属性module.function_xy? 或module.ClassX.method_xy? 将向您显示该函数/方法的docstringmodule.function_x?? 或module.SomeClass.method_xy?? 将向您显示函数/方法的源代码。
对于全局函数,
例如运行:
1 2 | >>> import re >>> dir(re) |
返回如下函数/类:
1 | '__all__', '_MAXCACHE', '_alphanum_bytes', '_alphanum_str', '_pattern_type', '_pickle', '_subx' |
其中一些通常不用于一般编程用途(但模块本身除外,如
下面是一个例子:
1 2 3 4 | >>> import re >>> re.__all__ ['match', 'fullmatch', 'search', 'sub', 'subn', 'split', 'findall', 'finditer', 'compile', 'purge', 'template', 'escape', 'error', 'A', 'I', 'L', 'M', 'S', 'X', 'U', 'ASCII', 'IGNORECASE', 'LOCALE', 'MULTILINE', 'DOTALL', 'VERBOSE', 'UNICODE'] >>> |
所有带有下划线的函数和类都已删除,只剩下那些定义为公共的函数和类,因此可以通过
注意,
AST模块的情况如下:
1 2 3 4 5 6 | >>> import ast >>> ast.__all__ Traceback (most recent call last): File"<stdin>", line 1, in <module> AttributeError: module 'ast' has no attribute '__all__' >>> |
除了前面答案中提到的dir(模块)或help(模块)之外,您还可以尝试:-开放式iPython-导入模块名称-键入module_name,按tab。它将打开一个小窗口,其中列出了Python模块中的所有函数。它看起来很干净。
下面是列出hashlib模块所有函数的代码段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | (C:\Program Files\Anaconda2) C:\Users\lenovo>ipython Python 2.7.12 |Anaconda 4.2.0 (64-bit)| (default, Jun 29 2016, 11:07:13) [MSC v.1500 64 bit (AMD64)] Type"copyright","credits" or"license" for more information. IPython 5.1.0 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system. object? -> Details about 'object', use 'object??' for extra details. In [1]: import hashlib In [2]: hashlib. hashlib.algorithms hashlib.new hashlib.sha256 hashlib.algorithms_available hashlib.pbkdf2_hmac hashlib.sha384 hashlib.algorithms_guaranteed hashlib.sha1 hashlib.sha512 hashlib.md5 hashlib.sha224 |
如果您不能在没有导入错误的情况下导入所说的python文件,那么这些答案都不起作用。当我检查一个文件时,情况就是这样的,这个文件来自一个具有很多依赖性的大型代码库。下面将以文本形式处理文件,并搜索以"def"开头的所有方法名,然后打印它们及其行号。
1 2 3 4 5 | import re pattern = re.compile("def (.*)\(") for i, line in enumerate(open('Example.py')): for match in re.finditer(pattern, line): print '%s: %s' % (i+1, match.groups()[0]) |
这将在列表中附加在您的_模块中定义的所有函数。
1 2 3 4 | result=[] for i in dir(unit8_conversion_methods): if type(getattr(your_module, i)).__name__ =="function": result.append(getattr(your_module, i)) |
可以使用以下方法从shell中获取模块中的所有函数:
1 | module.*? |
使用DIR(模块)不合适(至少不再合适)。代码应如下所示:
1 | dir('module') or dir('modules') |
或者,您可以这样指定您想要的模块:
感谢所有的投票。当我发布这个时,我使用了python3.2.2和其他3x版本。重点是使用("stufacture")而不是以前的(stufacture)。但我假设你们都坚持使用python2或者使用更新版本的个人电脑,而不是像我一样移动。
http://effbot.org/librarybook/sys.htm网站