私は自分のシステムにインストールされているpythonモジュールを持っていて、どんな関数/クラス/メソッドがそれで利用可能かを見たいと思います。
それぞれについてdoc関数を呼び出したい。 Rubyでは、ClassName.methodsのようにしてそのクラスで利用可能なすべてのメソッドのリストを取得できます。 Pythonに似たようなものはありますか?
例えば。何かのようなもの:
from somemodule import foo
print foo.methods # or whatever is the correct method to call
検査モジュール pydoc
モジュール、対話型インタプリタのhelp()
関数、そしてあとに続くドキュメントを生成するpydoc
コマンドラインツールも見てください。あなたは彼らにあなたがドキュメンテーションを見たいクラスを与えることができます。たとえば、HTML出力を生成してそれをディスクに書き込むこともできます。
利用可能なすべてのメソッド/属性を見るために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)タプルのリストを返します。
Inspectモジュールのisfunctionを他のisXXX関数に置き換えることができます。
import types
import yourmodule
print([getattr(yourmodule, a) for a in dir(yourmodule)
if isinstance(getattr(yourmodule, a), types.FunctionType)])
完全を期すために、インポートする代わりにparse codeを使用することをお勧めします。 import
はトップレベルの式をexecuteするでしょう、そしてそれは問題になるかもしれません。
たとえば、 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 __== "__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
のように実行時に生成される関数を検出できないという欠点があります。
これでうまくいくでしょう。
dir(module)
ただし、返されたリストを読むのが面倒な場合は、次のループを使用して1行に1つの名前を付けてください。
for i in dir(module): print i
パースしたくないコードの場合は、上記の@cslのASTベースのアプローチをお勧めします。
それ以外のすべてについては、inspectモジュールは正しいです。
import inspect
import <module_to_inspect> as module
functions = inspect.getmembers(module, inspect.isfunction)
これは[(<name:str>, <value:function>), ...]
の形式で2タプルのリストを与えます。
上記の簡単な答えは、さまざまな回答やコメントで示唆されていますが、明示的には言及されていません。
ほとんどの回答で述べられているように、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??
は関数/メソッドのソースコードを表示します。グローバル関数では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__'
>>>
あなたがインポートエラーなしで上記の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])
前の回答で述べた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
次の方法を使用して、Shellから自分のモジュール内のすべての関数を一覧表示することができます。
import module
module.*?
これはyour_moduleで定義されているすべての関数をリストに追加します。
result=[]
for i in dir(unit8_conversion_methods):
if type(getattr(your_module, i)).__== "function":
result.append(getattr(your_module, i))