Pythonモジュールのすべての関数をリストする方法は?


418

私のシステムにPythonモジュールがインストールされていますが、その中で使用できる関数/クラス/メソッドを確認できます。

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

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

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

3
選択した回答を確認することを検討してください!他の回答で提案されている解決策を使用する方が良い/簡単です。
Zahra 2017

回答:


139

inspectモジュール。また、pydocモジュール、help()インタラクティブインタープリターの関数、およびpydoc必要なドキュメントを生成するコマンドラインツールもご覧ください。ドキュメントを表示したいクラスをそれらに与えることができます。たとえば、HTML出力を生成してディスクに書き込むこともできます。


3
私の回答astでは特定の状況でモジュールを使用することを主張しました
csl 2015年

28
TL;以下の回答のDR:dir関数と変数を返すために使用します。inspect関数のみをフィルタリングするために使用します。astインポートせずに解析するために使用します。
Jonathan H

結果の出力はソリューションごとに大幅に異なるため、Sheljohnによって要約されているように、各アプローチをテストする価値があります。
clozach

1
@ Hack-R mymoduleのすべての関数をリストするコードは次のとおりです。[f [0] for f in inspect.getmembers(mymodule、inspect.isfunction)]
SurpriseDog

498

を使用dir(module)して、使用可能なすべてのメソッド/属性を表示できます。PyDocsも確認してください。


15
これは厳密には当てはまりません。このdir()機能は、「完全ではなく、最も関連性の高い情報を生成することを試みます」ソース: docs.python.org/library/functions.html#dir
Zearin

15
@jAckOdE引用?次に、文字列モジュールの使用可能なメソッドと属性を取得します。
OrangeTux 2014年

@OrangeTux:おっと、それは問題になるはずです。ええ、あなたはそれに答えました。
jAckOdE 2014年

1
OPは、変数ではなく関数を明確に要求します。Cfはを使用して応答しinspectます。
Jonathan H

168

importモジュールを編集したら、次の操作を実行できます。

 help(modulename)

...すべての機能に関するドキュメントをインタラクティブに一度に取得します。または、以下を使用できます。

 dir(modulename)

...モジュールで定義されているすべての関数と変数の名前をリストするだけです。


1
@ sheljohn…この批評のポイントは何ですか?私のソリューションは関数リストし、inspect モジュールはここで明示的に要求されていなくても変数をリストすることもできます。このソリューションでは組み込みオブジェクトのみが必要です。これは、Pythonが制約された/ロックダウンされた/壊れた環境にインストールされている場合に非常に役立ちます。
Dan Lenski 2018年

おかげで、これはほぼうまくいきましたdirが、結果を出力すると思いprint(dir(modulename))ましたが、実行する必要があるようです。
Eliot

96

検査の例:

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関数で置き換えることができます。


27
getmembers述語を取ることができるので、あなたの例も書くことができます: functions_list = [o for o in getmembers(my_module, isfunction)]
Christopher Currie

27
@ChristopherCurrie functions_list = getmembers(my_module, predicate)は、リストが既に返されるため、無用なリストの理解を避けることもできます;)
Nil

5
(インポートされたのではなく)そのモジュールで関数が定義されているかどうかを確認するには、「if isfunction(o [1])and o [1] .__ module__ == my_module .__ name__」を追加します。インポートされた関数は、このモジュールと同じ名前のモジュールからのものです。
Michael Scott Cuthbert

72
import types
import yourmodule

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

8
このルートでは、yourmodule .__ dict __。get(a)の代わりにgetattr(yourmodule、a、None)を使用してください
Thomas Wouters

4
your_module .__ dict__が私の選択です。これは、実際にfunctionName:<function>を含む辞書を取得し、その関数を動的に呼び出すことができるようになったためです。良い時間!
jsh

1
いくつかの砂糖に優しいPython 3:インポートタイプdef print_module_functions(module):print( '\ n'.join([str(module .__ dict __。get(a).__ name__)for in dir(module)if isinstance(module。 __dict __。get(a)、types.FunctionType)]))
y.selivonchyk 2017

1
これにより、そのモジュールがインポートするすべての関数もリストされます。それはあなたが望むものかもしれませんし、そうでないかもしれません。
スキューボ

48

完全を期すために、コードをインポートする代わりに解析したい場合があることを指摘しておきます。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


3
私はこれが好き; 私は現在、誰かがpydocのようなことをするがモジュールをインポートすることなく行うツールをすでに書いたかどうかを調べようとしています。これまでのところ、これは私が見つけた最良の例です:)
James Mills

この回答に同意します。ターゲットファイルが何をインポートするか、それがどのバージョンのpythonに対応しているかに関係なく、この関数が機能する必要があります。これは、impおよびimportlibが実行するインポートの問題には該当しません。
Eric Evans

モジュール変数(__version__など)はどうですか?それを取得する方法はありますか?
frakman1

29

解析したくないコードについては、上記の@cslのASTベースのアプローチをお勧めします。

それ以外の場合は、inspectモジュールが正しいです。

import inspect

import <module_to_inspect> as module

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

これにより、フォームに2タプルのリストが表示され[(<name:str>, <value:function>), ...]ます。

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


それを綴ってくれてありがとう。検査するモジュールでインポートを実行できる場合、これは正しい答えだと思います。
Jonathan H

25

これはトリックを行います:

dir(module) 

ただし、返されたリストを読むのが面倒な場合は、次のループを使用して、1行につき1つの名前を取得します。

for i in dir(module): print i

2
OPは、変数ではなく関数を明確に要求します。Cfはを使用して応答しinspectます。さらに、これは@DanLenskiの回答とどのように異なりますか?
Jonathan H

20

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

ただし、IPythonのようなインタラクティブなPythonシェルでは、タブ補完を使用して、モジュールで定義されているすべてのオブジェクトの概要を取得できます。これは、スクリプトを使用printしてモジュールで何が定義されているかを確認するよりもはるかに便利です。

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

19

dir()(これらの回答のほとんどで述べられているように)グローバル関数は使用するコマンドですが、これはパブリック関数と非パブリック関数の両方を一緒にリストします。

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

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

次のような関数/クラスを返します:

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

そのうちのいくつかは、一般に、一般的なプログラミングの使用のためのもの(ただし、モジュール自体によって、等DunderAliasesの場合を除いていない__doc____file__ECT)。このため、それらを公開のものと一緒にリストすることは役に立たない場合があります(これは、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']
>>>

アンダースコア付きのすべての関数とクラスが削除され、パブリックとして定義されているためを介して使用できるものだけが残り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__'
>>>

4

インポートエラーなしで上記の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
この場合、astモジュールを使用する方がはるかに優れています。例については、私の回答を参照しください。
csl 2015年

これは有効な方法だと思います。なぜ反対票を投じるのですか?
m3nda 2015年

2

以前の回答で言及されたdir(module)またはhelp(module)を除いて、次のことも試すことができ ます。-
ipythonを開きます-module_nameを
インポートします-module_nameと
入力し、タブを押します。小さなウィンドウが開き、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

これにより、your_moduleで定義されているすべての関数がリストに追加されます。

result=[]
for i in dir(your_module):
    if type(getattr(your_module, i)).__name__ == "function":
        result.append(getattr(your_module, i))

なにこれunit8_conversion_methods?これは単なるモジュール名の例ですか?
nocibambi

@nocibambiはい、それは単なるモジュール名です。
Manish Kumar

2
マニッシュに感謝します。:私は、次の1行の代替提案[getattr(your_module, func) for func in dir(your_module) if type(getattr(your_module, func)).__name__ == "function"]
アミン

0

次のメソッドを使用して、シェルからモジュール内のすべての関数のリストを取得できます。

import module

module.*?

1
@GabrielFairどのバージョン/プラットフォームでPythonを実行していますか?Py3.7 / Win10で構文エラーが発生します。
toonarmycaptain

0
import sys
from inspect import getmembers, isfunction
fcn_list = [o[0] for o in getmembers(sys.modules[__name__], isfunction)]

0
r = globals()
sep = '\n'+100*'*'+'\n' # To make it clean to read.
for k in list(r.keys()):
    try:
        if str(type(r[k])).count('function'):
            print(sep+k + ' : \n' + str(r[k].__doc__))
    except Exception as e:
        print(e)

出力:

******************************************************************************************
GetNumberOfWordsInTextFile : 

    Calcule et retourne le nombre de mots d'un fichier texte
    :param path_: le chemin du fichier à analyser
    :return: le nombre de mots du fichier

******************************************************************************************

    write_in : 

        Ecrit les donnees (2nd arg) dans un fichier txt (path en 1st arg) en mode a,
        :param path_: le path du fichier texte
        :param data_: la liste des données à écrire ou un bloc texte directement
        :return: None


 ******************************************************************************************
    write_in_as_w : 

            Ecrit les donnees (2nd arg) dans un fichier txt (path en 1st arg) en mode w,
            :param path_: le path du fichier texte
            :param data_: la liste des données à écrire ou un bloc texte directement
            :return: None
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.