我有一个python模块安装在我的系统上,我希望能够看到哪些函数/类/方法可用。如何列出Python模块中的所有函数?
我想调用每个文档功能。在ruby中,我可以做类似ClassName.methods的东西来获得该类上所有可用方法的列表。 python中有类似的东西吗?
例如。例如:
from somemodule import foo
print foo.methods # or whatever is the correct method to call
我有一个python模块安装在我的系统上,我希望能够看到哪些函数/类/方法可用。如何列出Python模块中的所有函数?
我想调用每个文档功能。在ruby中,我可以做类似ClassName.methods的东西来获得该类上所有可用方法的列表。 python中有类似的东西吗?
例如。例如:
from somemodule import foo
print foo.methods # or whatever is the correct method to call
检查模块。另请参阅pydoc
模块,交互式解释器中的help()
函数以及生成您所需文档的命令行工具pydoc
。你可以给他们上课,你希望看到的文件。它们也可以生成HTML输出,并将其写入磁盘。
我在[我的答案](http://stackoverflow.com/a/31005891/21028)中的某些情况下使用了`ast`模块。 – csl 2015-06-23 14:57:47
我不明白为什么选择这个答案作为答案,但显然有更好的答案... – frankliuao 2016-12-05 21:50:53
您可以使用dir(module)
查看所有可用的方法/属性。另外检查PyDocs。
import types
import yourmodule
print [yourmodule.__dict__.get(a) for a in dir(yourmodule)
if isinstance(yourmodule.__dict__.get(a), types.FunctionType)]
一旦你import
编的模块,你可以做:
...要获得所有功能的文档一次完成,交互。或者您可以使用:
dir(modulename)
...简单地列出模块中定义的所有函数和变量的名称。
这将这样的伎俩:
dir(module)
不过,如果你觉得这恼人阅读返回列表,就用下面的循环得到每行一个名称。
for i in dir(module): print i
用一个例子检查:
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_type的)元组的列表。
您可以用inspect模块中的任何其他isXXX函数替换isfunction。
dir(module)
是使用脚本或标准解释程序时的标准方式,如大多数答案中所述。
但是,使用像IPython这样的交互式python shell,您可以使用tab-completion来获取模块中定义的所有对象的概览。 这比使用脚本和print
来查看模块中定义的内容要方便得多。
module.<tab>
将显示模块中定义的所有对象(函数,类等)module.ClassX.<tab>
将显示一个类的方法和属性module.function_xy?
或module.ClassX.method_xy?
将显示您的文档字符串该函数/方法module.function_x??
或module.SomeClass.method_xy??
将向您显示函数/方法的源代码。它不是(或至少不再)适用于使用dir(模块)。代码应该这样写:
dir('module') or dir('modules')
或者你指定要这样的模块:dir('sys')
以从模块名称SYS结果。 dir()
返回错误,而dir('')
是你需要的。 * help('')将返回帮助信息(如果适用于大多数功能)。例如; help('modules')
将返回模块帮助信息。
感谢所有的反对票。当我发布这个时,我正在使用Python3.2.2和其他3x版本。重点是使用('东西'),而不是以前的(东西)。但是我假设你的所有人都坚持使用Python2,或者使用PC的新版本,而不是像我一样移动。如果你不能说进口不导入错误的Python文件
这些答案都将无法工作。当我检查来自具有很多依赖关系的大型代码库的文件时,情况就是这样。以下将以文本形式处理文件并搜索以“def”开头的所有方法名称并打印它们及其行号。
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])
为了完整起见,我想指出的是,有时你可能想解析代码,而不是将其导入的。 import
将执行顶级表达式,这可能是一个问题。
例如,我让用户选择使用zipapp进行包装的入口点函数。使用import
和inspect
冒着运行歧途代码的风险,导致崩溃,帮助消息被打印出来,GUI对话框弹出等等。
相反,我用ast模块列出所有的顶级功能:
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)
把这个代码list.py
并使用自身作为输入,我得到:
$ python list.py list.py
list.py
top_level_functions
parse_ast
当然,导航AST可能有点棘手,即使是像Python这样的相对简单的语言,因为AST是相当低级的。但是如果你有一个简单明了的用例,它既可行又安全。
尽管如此,缺点是您无法检测运行时生成的函数,如foo = lambda x,y: x*y
。
您可以用下面的方法来获取列表的模块中的所有功能,从外壳:
import module
module.*?
除了在前面的答案中提到目录(模块)或帮助(模块),你也可以尝试:
- 打开ipython
- import module_name
- 键入module_name,按tab键。它会打开一个小窗口,列出python模块中的所有功能。
它看起来非常整齐。
这里的代码片段上市hashlib模块
(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
所有的功能代码,你不想分析,我建议上述@csl的基于AST的方法。
对于一切,在检查模块是正确的:
import inspect
import <module_to_inspect> as module
functions = inspect.getmembers(module, inspect.isfunction)
这给出了形式[(<name:str>, <value:function>), ...]
的2元组的列表。
上面的简单答案暗示在各种回复和评论中,但没有明确地提出。
请考虑审查所选答案!在其他答案中建议使用更好/更易于使用的解决方案。 – r2d2oid 2017-08-29 20:02:32