Pythonを使用したさまざまなプロジェクト(Django Web開発およびPanda3Dゲーム開発を含む)でコーディングを始めています。
何が起こっているのかを理解するのを助けるために、基本的にはPythonオブジェクトの内部を「見て」、それらがどのように動くかを確認したいと思います-メソッドやプロパティのように。
だから私はPythonオブジェクトを持っているとしましょう、その内容を印刷するには何が必要ですか?それは可能ですか?
Pythonを使用したさまざまなプロジェクト(Django Web開発およびPanda3Dゲーム開発を含む)でコーディングを始めています。
何が起こっているのかを理解するのを助けるために、基本的にはPythonオブジェクトの内部を「見て」、それらがどのように動くかを確認したいと思います-メソッドやプロパティのように。
だから私はPythonオブジェクトを持っているとしましょう、その内容を印刷するには何が必要ですか?それは可能ですか?
回答:
Pythonには、強力なイントロスペクション機能があります。
次の組み込み関数を見てください。
type()
そしてdir()
、オブジェクトの種類と、それぞれの属性のセットを検査するために特に有用です。
object.__dict__
vars(object)
そのために作られました。
from pprint import pprint; pprint(vars(object))
に、オブジェクトの内容について本当に素晴らしい見解を与えてくれました。ありがとう@liberforce
まず、ソースを読みます。
次に、dir()
関数を使用します。
誰も言及したヘルプにまだ驚いています!
In [1]: def foo():
...: "foo!"
...:
In [2]: help(foo)
Help on function foo in module __main__:
foo()
foo!
ヘルプを使用すると、ドキュメント文字列を読んで、クラスがどのような属性を持っているかを知ることができます。これは非常に役立ちます。
これが何が起こっているのかを調べるための探索である場合は、IPythonを確認することをお勧めします。これにより、オブジェクトのドキュメント、プロパティ、さらにはソースコードを取得するためのさまざまなショートカットが追加されます。たとえば、「?」を追加します 関数にオブジェクトのヘルプ(実質的には「help(obj)」のショートカット)を提供します。2つの?( " func??
")を使用すると、ソースコードが利用可能な場合に表示されます。
また、タブ補完、結果のきれいな印刷、結果履歴など、この種の探索的プログラミングに非常に便利な便利な機能もたくさんあります。
イントロスペクションの多くのプログラムで使用するため、などの基本的な組み込みコマンドdir()
、vars()
、getattr
などが有用であろうが、チェックアウトして、あなたの時間の価値が充分ある検査モジュールを。関数のソースを取得するには、 " inspect.getsource
"を使用します。たとえば、それ自体に適用します。
>>> print inspect.getsource(inspect.getsource)
def getsource(object):
"""Return the text of the source code for an object.
The argument may be a module, class, method, function, traceback, frame,
or code object. The source code is returned as a single string. An
IOError is raised if the source code cannot be retrieved."""
lines, lnum = getsourcelines(object)
return string.join(lines, '')
inspect.getargspec
関数パラメーターの名前とデフォルト値を提供するため、関数のラッピングや操作を行う場合にも頻繁に役立ちます。
このためのGUIに興味がある場合は、objbrowserを参照してください。下のオブジェクトイントロスペクションには、Python標準ライブラリのinspectモジュールを使用します。
シェルでdir()を使用してオブジェクトの属性をリストできます。
>>> dir(object())
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
もちろん、inspectモジュールもあります:http : //docs.python.org/library/inspect.html#module-inspect
"""Visit http://diveintopython.net/"""
__author__ = "Mark Pilgrim (mark@diveintopython.org)"
def info(object, spacing=10, collapse=1):
"""Print methods and doc strings.
Takes module, class, list, dictionary, or string."""
methodList = [e for e in dir(object) if callable(getattr(object, e))]
processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
print "\n".join(["%s %s" %
(method.ljust(spacing),
processFunc(str(getattr(object, method).__doc__)))
for method in methodList])
if __name__ == "__main__":
print help.__doc__
トライppretty
from ppretty import ppretty
class A(object):
s = 5
def __init__(self):
self._p = 8
@property
def foo(self):
return range(10)
print ppretty(A(), indent=' ', depth=2, width=30, seq_length=6,
show_protected=True, show_private=False, show_static=True,
show_properties=True, show_address=True)
出力:
__main__.A at 0x1debd68L (
_p = 8,
foo = [0, 1, 2, ..., 7, 8, 9],
s = 5
)
他の人はすでにあなたが探しているように聞こえる組み込みのdir()について言及していますが、ここに別の良いヒントがあります。ほとんどの標準ライブラリを含む多くのライブラリは、ソース形式で配布されています。つまり、ソースコードを直接簡単に読み取ることができます。秘訣はそれを見つけることです。例えば:
>>> import string
>>> string.__file__
'/usr/lib/python2.5/string.pyc'
* .pycファイルはコンパイルされているので、末尾の「c」を削除して、コンパイルされていない* .pyファイルをお気に入りのエディターまたはファイルビューアーで開きます。
/usr/lib/python2.5/string.py
これは、特定のAPIからどの例外が発生するかなどを見つけるのに非常に役立つことがわかりました。この種の詳細は、Pythonの世界ではめったに文書化されていません。
一方でpprint
他の人がすでに述べてきた私はいくつかのコンテキストを追加したいと思います。
pprintモジュールは、インタプリタへの入力として使用できる形式で任意のPythonデータ構造を「きれいに印刷」する機能を提供します。フォーマットされた構造に基本的なPythonタイプではないオブジェクトが含まれている場合、表現はロードできない可能性があります。これは、ファイル、ソケット、クラス、インスタンスなどのオブジェクト、およびPython定数として表現できない他の多くの組み込みオブジェクトが含まれている場合に当てはまります。
pprint
に代わるものを探しているPHPのバックグラウンドを持つ開発者からの需要が高いかもしれません var_dump()
。
dict属性を持つオブジェクトは、モジュール、クラス、インスタンスなどの属性を返すpprint()
との混合を使用して適切にダンプできます。vars()
__dict__
from pprint import pprint
pprint(vars(your_object))
したがって、ループは必要ありません。
グローバルスコープまたはローカルスコープに含まれるすべての変数をダンプするには、次のコマンドを使用します。
pprint(globals())
pprint(locals())
locals()
関数で定義された変数を示します。他の使用法の
中でも、対応する名前を文字列キーとして使用して関数にアクセスすると便利です。
locals()['foo']() # foo()
globals()['foo']() # foo()
同様に、dir()
モジュールのコンテンツまたはオブジェクトの属性を表示するために使用します。
そして、まだまだあります。
パラメータやメソッドを見たい場合は、他の人が指摘しているようにpprint
、dir()
コンテンツの実際の値を見たい場合は、
object.__dict__
コードを検査するための2つの優れたツールは次のとおりです。
IPython。タブ補完を使用して検査できるPython端末。
EclipseとPyDevプラグイン。優れたデバッガーを備えているため、特定の場所でブレークし、すべての変数をツリーとして参照してオブジェクトを検査できます。埋め込み端末を使用して、その場所でコードを試すか、オブジェクトを入力して「。」を押すこともできます。コードヒントを提供するため。
この目的のためだけに作成されたpythonコードライブラリビルドがあります。Python2.7で 導入された検査
ライブオブジェクトの内部を見たい場合inspect
は、Pythonのモジュールが適切な答えです。一般に、ディスク上のどこかにあるソースファイルで定義されている関数のソースコードを取得するために機能します。インタープリターで定義されたライブ関数とラムダのソースを取得する場合は、dill.source.getsource
from を使用できますdill
。また、カレーで定義されたバインド済みまたはバインドなしのクラスメソッドおよび関数からコードを取得することもできます。ただし、囲んでいるオブジェクトのコードがないと、そのコードをコンパイルできない場合があります。
>>> from dill.source import getsource
>>>
>>> def add(x,y):
... return x+y
...
>>> squared = lambda x:x**2
>>>
>>> print getsource(add)
def add(x,y):
return x+y
>>> print getsource(squared)
squared = lambda x:x**2
>>>
>>> class Foo(object):
... def bar(self, x):
... return x*x+x
...
>>> f = Foo()
>>>
>>> print getsource(f.bar)
def bar(self, x):
return x*x+x
>>>
vars(obj)は、オブジェクトの属性を返します。
使ってみてください:
print(object.stringify())
object
で、検査しようとしているオブジェクトの変数名です。これにより、オブジェクトのキーと値のすべての階層を示す、適切にフォーマットされたタブ付きの出力が出力されます。
注:これはpython3で動作します。それが以前のバージョンで動作するかどうかわからない
更新:これは、すべてのタイプのオブジェクトで機能するわけではありません。これらのタイプのいずれかに遭遇した場合(Requestオブジェクトなど)、代わりに次のいずれかを使用してください。
dir(object())
または
import pprint
次に:
pprint.pprint(object.__dict__)