Pythonモジュールのすべての関数をリストする方法は?
-
02-07-2019 - |
質問
システムにpythonモジュールがインストールされているので、使用可能な関数/クラス/メソッドを確認したいと思います。
それぞれに対してdoc関数を呼び出したい。ルビーでは、ClassName.methodsのようなことをして、そのクラスで使用可能なすべてのメソッドのリストを取得できます。 Pythonに似たようなものがありますか?
eg。次のようなもの:
from somemodule import foo
print foo.methods # or whatever is the correct method to call
他のヒント
dir(module)
を使用して、使用可能なすべてのメソッド/属性を表示できます。 PyDocsもご覧ください。
モジュールをimport
編集したら、次の操作を実行できます。
help(modulename)
...すべての機能に関するドキュメントを一度に対話形式で取得します。または、次を使用できます。
dir(modulename)
...モジュールで定義されているすべての関数と変数の名前を単純にリストします。
検査の例:
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関数のいずれかに置き換えることができます。
import types
import yourmodule
print([getattr(yourmodule, a) for a in dir(yourmodule)
if isinstance(getattr(yourmodule, a), types.FunctionType)])
完全を期すために、コードをインポートする代わりに解析したい場合があることを指摘したいと思います。 import
はトップレベルの式を実行するため、問題になる可能性があります。
たとえば、 zipappで作成されるパッケージのエントリポイント関数をユーザーに選択させる。 inspect
およびlist.py
を使用すると、誤ったコードが実行され、クラッシュ、ヘルプメッセージの印刷、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)
このコードをfoo = lambda x,y: x*y
に入れ、それ自体を入力として使用すると、次のようになります。
$ python list.py list.py
list.py
top_level_functions
parse_ast
もちろん、ASTは非常に低レベルであるため、Pythonのような比較的単純な言語であっても、ASTをナビゲートするのは難しい場合があります。しかし、シンプルで明確なユースケースがある場合、それは実行可能で安全です。
ただし、マイナス面は、<=>のように、実行時に生成される関数を検出できないことです。
これはトリックを実行します:
dir(module)
ただし、返されたリストを読むのが面倒な場合は、次のループを使用して1行に1つの名前を取得します。
for i in dir(module): print i
dir(module)
は、ほとんどの回答で述べられているように、スクリプトまたは標準インタープリターを使用する場合の標準的な方法です。
ただし、 IPython のようなインタラクティブなPythonシェルでは、tab-completionを使用して、モジュールで定義されているすべてのオブジェクトの概要を取得できます。
これは、スクリプトとprint
を使用してモジュールで何が定義されているかを確認するよりもはるかに便利です。
-
module.<tab>
は、モジュールで定義されたすべてのオブジェクト(関数、クラスなど)を表示します -
module.ClassX.<tab>
は、クラスのメソッドと属性を表示します -
module.function_xy?
またはmodule.ClassX.method_xy?
は、その関数/メソッドのdocstringを表示します -
module.function_x??
またはmodule.SomeClass.method_xy??
は、関数/メソッドのソースコードを表示します。
解析したくないコードについては、上記の@cslのASTベースのアプローチをお勧めします。
他のすべてについては、検査モジュールは正しいです:
import inspect
import <module_to_inspect> as module
functions = inspect.getmembers(module, inspect.isfunction)
これは、[(<name:str>, <value:function>), ...]
の形式で2タプルのリストを提供します。
上記の簡単な答えは、さまざまな応答やコメントで示唆されていますが、明示的には呼び出されていません。
グローバル関数の場合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__を説明できますか import *
。
例を次に示します。
>>> 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']
>>>
アンダースコア付きのすべての関数とクラスは削除され、パブリックとして定義されているため、AttributeError
経由で使用できるもののみが残ります。
<=>は常に定義されているわけではないことに注意してください。含まれていない場合は、<=>が発生します。
このケースは、astモジュールの場合です:
>>> import ast
>>> ast.__all__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'ast' has no attribute '__all__'
>>>
上記のPythonファイルをインポートエラーなしでインポートできない場合、これらの回答は機能しません。これは、多くの依存関係を持つ大規模なコードベースからのファイルを検査していたときのことです。以下は、ファイルをテキストとして処理し、<!> quot; def <!> quotで始まるすべてのメソッド名を検索します。それらとその行番号を印刷します。
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])
前の回答で言及された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
次のメソッドを使用して、シェルからモジュール内のすべての関数のリストを取得できます。
import module
module.*?
これにより、your_moduleで定義されているすべての関数がリストに追加されます。
result=[]
for i in dir(unit8_conversion_methods):
if type(getattr(your_module, i)).__name__ == "function":
result.append(getattr(your_module, i))
dir(module)を使用するのは適切ではありません(少なくとも、もはや適切ではありません)。コードは次のようになります。
dir('module') or dir('modules')
または、次のようにモジュールを指定します:dir('sys')
モジュール名sysから結果を生成します。 dir()
はエラーを返しますが、dir('')
は必要なものです。 * help( '')は、ほとんどの機能で利用可能な場合、ヘルプ情報を返します。例えば; help('modules')
はモジュールのヘルプ情報を返します。
すべての賛成票に感謝します。これを投稿したとき、Python3.2.2と他の3xバージョンを使用していました。ポイントは、前の(stuff)の代わりに( 'stuff')を使用することでした。しかし、私はあなたのすべてがPython2に固執している、または私のようにモバイルではないPC用の新しいバージョンを使用していると仮定しています。