web-dev-qa-db-ja.com

Pythonモジュール内のすべての関数を一覧表示する方法

私は自分のシステムにインストールされているpythonモジュールを持っていて、どんな関数/クラス/メソッドがそれで利用可能かを見たいと思います。

それぞれについてdoc関数を呼び出したい。 Rubyでは、ClassName.methodsのようにしてそのクラスで利用可能なすべてのメソッドのリストを取得できます。 Pythonに似たようなものはありますか?

例えば。何かのようなもの:

from somemodule import foo
print foo.methods # or whatever is the correct method to call
336
Chris Gow

検査モジュール pydoc モジュール、対話型インタプリタのhelp()関数、そしてあとに続くドキュメントを生成するpydocコマンドラインツールも見てください。あなたは彼らにあなたがドキュメンテーションを見たいクラスを与えることができます。たとえば、HTML出力を生成してそれをディスクに書き込むこともできます。

111
Thomas Wouters

利用可能なすべてのメソッド/属性を見るためにdir(module)を使用できます。 PyDocsも調べてください。

431
camflan

モジュールをimportしたら、次のようにします。

 help(modulename)

...対話的に、すべての機能に関するドキュメントを一度に取得する。またはあなたが使用することができます:

 dir(modulename)

...モジュール内で定義されているすべての関数と変数の名前を単純にリストします。

137
Dan Lenski

検査の例:

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)タプルのリストを返します。

Inspectモジュールのisfunctionを他のisXXX関数に置き換えることができます。

74
adnan
import types
import yourmodule

print([getattr(yourmodule, a) for a in dir(yourmodule)
  if isinstance(getattr(yourmodule, a), types.FunctionType)])
66
Oli

完全を期すために、インポートする代わりにparse codeを使用することをお勧めします。 importはトップレベルの式をexecuteするでしょう、そしてそれは問題になるかもしれません。

たとえば、 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 __== "__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は非常に低レベルなので、ASTをナビゲートするのは、Pythonのような比較的単純な言語であっても難しい場合があります。しかし、単純で明確な使用例があれば、それは実行可能で安全です。

ただし、foo = lambda x,y: x*yのように実行時に生成される関数を検出できないという欠点があります。

36
csl

これでうまくいくでしょう。

dir(module) 

ただし、返されたリストを読むのが面倒な場合は、次のループを使用して1行に1つの名前を付けてください。

for i in dir(module): print i
23
Algorias

パースしたくないコードの場合は、上記の@cslのASTベースのアプローチをお勧めします。

それ以外のすべてについては、inspectモジュールは正しいです。

import inspect

import <module_to_inspect> as module

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

これは[(<name:str>, <value:function>), ...]の形式で2タプルのリストを与えます。

上記の簡単な答えは、さまざまな回答やコメントで示唆されていますが、明示的には言及されていません。

20
Cireo

ほとんどの回答で述べられているように、dir(module)はスクリプトや標準的なインタプリタを使うときの標準的な方法です。

しかし、 IPython のような対話型Pythonシェルでは、タブ補完を使用して、モジュールで定義されているすべてのオブジェクトの概要を表示できます。モジュールで何が定義されているかを見るためにスクリプトとprintを使うよりもはるかに便利です。

  • module.<tab>は、モジュールで定義されているすべてのオブジェクト(関数、クラスなど)を表示します。
  • module.ClassX.<tab>はクラスのメソッドと属性を表示します
  • module.function_xy?またはmodule.ClassX.method_xy?はその関数/メソッドのdocstringを表示します
  • module.function_x??またはmodule.SomeClass.method_xy??は関数/メソッドのソースコードを表示します。
20
bmu

グローバル関数ではdir()が(これらの答えの大部分で述べられているように)使用するコマンドですが、これは公開関数と非公開関数の両方を一緒にリストします。

たとえば、次のように実行します。

>>> import re
>>> dir(re)

以下のような関数/クラスを返します。

'__all__', '_MAXCACHE', '_alphanum_bytes', '_alphanum_str', '_pattern_type', '_pickle', '_subx'

そのうちのいくつかは一般に一般的なプログラミング使用のために意図されていません(しかし__doc____file__ ectのようなDunderAliasesの場合を除いて、モジュール自身によって)。このため、パブリックなものと一緒にリストするのは役に立たないかもしれません(これはPythonがfrom module import *を使うとき何を得るべきかを知っている方法です)。

__all__はこの問題を解決するために使うことができ、モジュール内のすべてのパブリック関数とクラスのリストを返します(しないはアンダースコアで始まります - _)。 を参照してください誰かがPythonで__all__を説明できますか。__all__の使用のため。

これが一例です。

>>> 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']
>>>

アンダースコアを含むすべての関数とクラスは削除され、publicとして定義されているのでimport *経由で使用できるものだけが残ります。

__all__は常に定義されているわけではないことに注意してください。含まれていない場合はAttributeErrorが発生します。

これのケースはastモジュールにあります:

>>> import ast
>>> ast.__all__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'ast' has no attribute '__all__'
>>>
14
Simon

あなたがインポートエラーなしで上記の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])
3
ckb

前の回答で述べたdir(モジュール)またはhelp(モジュール)を除いて、次のことを試すこともできます。
- 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
2

次の方法を使用して、Shellから自分のモジュール内のすべての関数を一覧表示することができます。

import module

module.*?
0
Vishal Lamba

これはyour_moduleで定義されているすべての関数をリストに追加します。

result=[]
for i in dir(unit8_conversion_methods):
    if type(getattr(your_module, i)).__== "function":
        result.append(getattr(your_module, i))
0
Manish Kumar