web-dev-qa-db-ja.com

Pythonオブジェクトの内部をどのように見ますか?

私はPythonを使ってさまざまなプロジェクト(Djangoウェブ開発やPanda3Dゲーム開発を含む)でコーディングを始めています。

何が起こっているのかを理解しやすくするために、基本的にPythonオブジェクトの内側を「見て」、それらがどのように動くかを調べます - それらのメソッドやプロパティのように。

それで、私がPythonオブジェクトを持っているとしたら、その内容をプリントアウトするために何が必要でしょうか?それでも可能ですか?

240
littlejim84

Pythonには強力なイントロスペクション機能があります。

次の 組み込み関数 を見てください。

type()dir()は、それぞれオブジェクトの型とその属性のセットを調べるのに特に便利です。

293

object.__dict__

155
mtasic85

まず、ソースを読みます。

次に、dir()関数を使います。

59
S.Lott

私は誰もまだ助けを述べていないのに驚いています!

In [1]: def foo():
   ...:     "foo!"
   ...:

In [2]: help(foo)
Help on function foo in module __main__:

foo()
    foo!

ヘルプを使用すると、docstringを読み、クラスにどのような属性があるのか​​を把握できます。これは非常に役立ちます。

50
Jason Baker

これが何が起こっているのかを調べるための探査のためのものであれば、 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は、関数パラメータの名前とデフォルト値を与えるので、関数の折り返しや操作を扱う場合にも便利です。

26
Brian

これにGUIに興味があるなら、 objbrowser を見てください。その下のオブジェクトのイントロスペクションには、Python標準ライブラリのinspectモジュールを使用します。

objbrowserscreenshot

14
titusjan

シェルの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

7
bayer
"""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__
7
erenon

試してください 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
)
7
Symon

他の人たちはすでにdir()組み込みについて言及しています。ほとんどの標準ライブラリを含む多くのライブラリがソース形式で配布されています。ソースコードを直接簡単に読むことができるという意味です。トリックはそれを見つけることにあります。例えば:

>>> import string
>>> string.__file__
'/usr/lib/python2.5/string.pyc'

* .pycファイルはコンパイルされているので、末尾の 'c'を削除し、コンパイルされていない* .pyファイルをお気に入りのエディタまたはファイルビューアで開きます。

/usr/lib/python2.5/string.py

私はこれが信じられないほど特定のAPIからどの例外が発生したかのようなことを発見するために有用であることがわかりました。この種の詳細は、Pythonの世界ではあまり文書化されていません。

7
Ryan Bright

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() を使ってモジュールの内容、あるいはオブジェクトの属性を見ることができます。

そしてまだまだあります。

6
wp78de

他の人が指摘したように、パラメータとメソッドを見たい場合は、pprintdir()を使うのが良いでしょう。

あなたが内容の実際の価値を見たいならば、あなたはすることができます

object.__dict__

4
Lakshman Prasad

この目的のためだけにpythonコードライブラリのビルドがあります。 inspect Python 2.7で導入されました。

3
Jonathan

コードを検査するための2つの優れたツールは以下のとおりです。

  1. IPython 。タブ補完を使って調べることができるpython端末。

  2. EclipsePyDevプラグイン 。それはあなたが与えられた場所で中断してツリーとしてすべての変数を閲覧することによってオブジェクトを調べることを可能にする優れたデバッガを持っています。埋め込み端末を使ってその場所でコードを試すことも、オブジェクトを入力して '。'を押すこともできます。それがあなたにコードヒントを与えるようにするために。

enter image description here

3
frmdstryr

pprintとdirは一緒に素晴らしい仕事

2
sqram

オブジェクトmyobjに対応する関数のソースコードを見たい場合は、iPythonまたはJupyter Notebookを入力します。

myobj??

1
Sahar

vars(obj)はオブジェクトの属性を返します。

1
Omid Farvid

ライブオブジェクトの内側を見たい場合は、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

>>> 
1
Mike McKerns
import pprint

pprint.pprint(obj.__dict__)

または

pprint.pprint(vars(obj))
1
northtree

さらに、リストや辞書を調べたいのなら、pprint()を使うことができます。

0
Glader