2008-09-26 73 views
250

我有一個python模塊安裝在我的系統上,我希望能夠看到哪些函數/類/方法可用。如何列出Python模塊中的所有函數?

我想調用每個文檔功能。在ruby中,我可以做類似ClassName.methods的東西來獲得該類上所有可用方法的列表。 python中有類似的東西嗎?

例如。例如:

from somemodule import foo 
print foo.methods # or whatever is the correct method to call 
+0

請考慮審查所選答案!在其他答案中建議使用更好/更易於使用的解決方案。 – r2d2oid 2017-08-29 20:02:32

回答

90

檢查模塊。另請參閱pydoc模塊,交互式解釋器中的help()函數以及生成您所需文檔的命令行工具pydoc。你可以給他們上課,你希望看到的文件。它們也可以生成HTML輸出,並將其寫入磁盤。

+1

我在[我的答案](http://stackoverflow.com/a/31005891/21028)中的某些情況下使用了`ast`模塊。 – csl 2015-06-23 14:57:47

+20

我不明白爲什麼選擇這個答案作爲答案,但顯然有更好的答案... – frankliuao 2016-12-05 21:50:53

331

您可以使用dir(module)查看所有可用的方法/屬性。另外檢查PyDocs。

+10

這不完全正確。 'dir()`函數「試圖產生最相關的信息,而不是完整的信息」。資料來源:http://docs.python.org/library/functions.html#dir。 – Zearin 2012-04-17 14:08:33

+14

@jAckOdE引用?然後你會得到可用的字符串模塊的方法和屬性。 – OrangeTux 2014-05-06 07:44:15

+0

@OrangeTux:哎呀,那應該是個問題。你好,你回答了。 – jAckOdE 2014-05-08 07:34:32

56
import types 
import yourmodule 

print [yourmodule.__dict__.get(a) for a in dir(yourmodule) 
    if isinstance(yourmodule.__dict__.get(a), types.FunctionType)] 
108

一旦你import編的模塊,你可以做:

​​

...要獲得所有功能的文檔一次完成,交互。或者您可以使用:

dir(modulename) 

...簡單地列出模塊中定義的所有函數和變量的名稱。

25

這將這樣的伎倆:

dir(module) 

不過,如果你覺得這惱人閱讀返回列表,就用下面的循環得到每行一個名稱。

for i in dir(module): print i 
53

用一個例子檢查:

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。

17

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??將向您顯示函數/方法的源代碼。
-5

它不是(或至少不再)適用於使用dir(模塊)。代碼應該這樣寫:

dir('module') or dir('modules') 

或者你指定要這樣的模塊:dir('sys')以從模塊名稱SYS結果。 dir()返回錯誤,而dir('')是你需要的。 * help('')將返回幫助信息(如果適用於大多數功能)。例如; help('modules')將返回模塊幫助信息。

感謝所有的反對票。當我發佈這個時,我正在使用Python3.2.2和其他3x版本。重點是使用('東西'),而不是以前的(東西)。但是我假設你的所有人都堅持使用Python2,或者使用PC的新版本,而不是像我一樣移動。如果你不能說進口不導入錯誤的Python文件

http://effbot.org/librarybook/sys.htm

1

這些答案都將無法工作。當我檢查來自具有很多依賴關係的大型代碼庫的文件時,情況就是這樣。以下將以文本形式處理文件並搜索以「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]) 
21

爲了完整起見,我想指出的是,有時你可能想解析代碼,而不是將其導入的。 import執行頂級表達式,這可能是一個問題。

例如,我讓用戶選擇使用zipapp進行包裝的入口點函數。使用importinspect冒着運行歧途代碼的風險,導致崩潰,幫助消息被打印出來,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

-5

您可以用下面的方法來獲取列表的模塊中的所有功能,從外殼:

import module

module.*? 
0

除了在前面的答案中提到目錄(模塊)或幫助(模塊),你也可以嘗試:
- 打開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 
1

所有的功能代碼,你不想分析,我建議上述@csl的基於AST的方法。

對於一切,在檢查模塊是正確的:

import inspect 

import <module_to_inspect> as module 

functions = inspect.getmembers(module, inspect.isfunction) 

這給出了形式[(<name:str>, <value:function>), ...]的2元組的列表。

上面的簡單答案暗示在各種回覆和評論中,但沒有明確地提出。

相關問題