私はPythonを使ってさまざまなプロジェクト(Djangoウェブ開発やPanda3Dゲーム開発を含む)でコーディングを始めています。
何が起こっているのかを理解しやすくするために、基本的にPythonオブジェクトの内側を「見て」、それらがどのように動くかを調べます - それらのメソッドやプロパティのように。
それで、私がPythonオブジェクトを持っているとしたら、その内容をプリントアウトするために何が必要でしょうか?それでも可能ですか?
object.__dict__
まず、ソースを読みます。
次に、dir()
関数を使います。
私は誰もまだ助けを述べていないのに驚いています!
In [1]: def foo():
...: "foo!"
...:
In [2]: help(foo)
Help on function foo in module __main__:
foo()
foo!
ヘルプを使用すると、docstringを読み、クラスにどのような属性があるのかを把握できます。これは非常に役立ちます。
これが何が起こっているのかを調べるための探査のためのものであれば、 IPython を見ることをお勧めします。これにより、オブジェクトのドキュメント、プロパティ、さらにはソースコードを取得するためのさまざまなショートカットが追加されます。たとえば、 "?"を追加する関数にオブジェクトを追加すると(実際には "help(obj)"のショートカットになります。2つの?( "func??
")を使用すると、ソースコードがある場合はそれが表示されます。
タブ補完、結果のきれいな印刷、結果の履歴など、この種の探索的プログラミングに非常に便利な追加の便利さもたくさんあります。
イントロスペクションをよりプログラム的に使用するには、dir()
、vars()
、getattr
などの基本的な組み込み関数が役立ちますが、 inspect モジュールをチェックするのには時間がかかります。関数のソースを取得するには "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 ([email protected])"
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 __== "__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
は、 var_dump()
の代わりになるものを探しているPHPバックグラウンドを持つ開発者からの需要が高いかもしれません。
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__
この目的のためだけにpythonコードライブラリのビルドがあります。 inspect Python 2.7で導入されました。
コードを検査するための2つの優れたツールは以下のとおりです。
IPython 。タブ補完を使って調べることができるpython端末。
Eclipse と PyDevプラグイン 。それはあなたが与えられた場所で中断してツリーとしてすべての変数を閲覧することによってオブジェクトを調べることを可能にする優れたデバッガを持っています。埋め込み端末を使ってその場所でコードを試すことも、オブジェクトを入力して '。'を押すこともできます。それがあなたにコードヒントを与えるようにするために。
pprintとdirは一緒に素晴らしい仕事
オブジェクトmyobj
に対応する関数のソースコードを見たい場合は、iPython
またはJupyter Notebook
を入力します。
myobj??
vars(obj)はオブジェクトの属性を返します。
ライブオブジェクトの内側を見たい場合は、pythonのinspect
モジュールが良い答えです。一般的に、ディスク上のどこかのソースファイルで定義されている関数のソースコードを取得するために機能します。インタプリタで定義されているライブ関数とラムダのソースを取得したい場合は、 dill
からdill.source.getsource
を使用できます。それはまたカレーで定義された束縛されたあるいは束縛されていないクラスメソッドや関数からのコードを取得することができます。
>>> 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
>>>
import pprint
pprint.pprint(obj.__dict__)
または
pprint.pprint(vars(obj))
さらに、リストや辞書を調べたいのなら、pprint()を使うことができます。