我有一個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