web-dev-qa-db-ja.com

PythonのPHPのvar_dump()に相当するものは何ですか?

PHPでデバッグするとき、私はコードに var_dump() を単に付けて変数が何であるか、その値が何であるかを示すのが便利だとよく思いますそれに含まれるものはすべて同じです。

これと同等の優れたPythonとは何ですか?

383
Zoredache

値をうまく表示するには、 pprint モジュールを使用できます。すべての変数をダンプする最も簡単な方法は、それを実行することです。

from pprint import pprint

pprint(globals())
pprint(locals())

CGIで実行している場合、便利なデバッグ機能は cgitb モジュールです。これはトレースバックの一部としてローカル変数の値を表示します。

253

私は、PHPのvar_dump($foo, $bar)と同等のものは printvars を組み合わせたものだと思います。

print vars(foo),vars(bar)
308
Jan

PHPvar_dump()に最も近いものは、組み込みinspectモジュールのpprint()関数を持つgetmembers()です。

from inspect import getmembers
from pprint import pprint
pprint(getmembers(yourObj))
48
Hai Phaikawl

PHPの var_export() は通常、オブジェクトを再作成するためにexec()することができる直列化されたバージョンのオブジェクトを表示します。 Pythonのそれに最も近いものは repr() です。

「多くの型で、この関数はeval()[...]に渡されたときに同じ値を持つオブジェクトを生成する文字列を返そうとします。」

23
Cody Casterline

私はPythonで使うためにPHPのvar_dumpに代わる非常に軽量なものを書き、それを後でオープンソースにしました。

GitHub: https://github.com/sha256/python-var-dump

pip を使って簡単にインストールできます。

pip install var_dump
16
sha256

だから私はこの質問と 別の質問 から答えを取り、以下に思いつきました。私はこれがほとんどの人にとって十分なPythonicではないと思います、しかし私は本当に私がある未知の変数が持っている値の深い表現を手に入れることができる何かを欲しました。どうすればこれを改善できるか、同じ動作を簡単に達成できるかについての提案があれば幸いです。

def dump(obj):
  '''return a printable representation of an object for debugging'''
  newobj=obj
  if '__dict__' in dir(obj):
    newobj=obj.__dict__
    if ' object at ' in str(obj) and not newobj.has_key('__type__'):
      newobj['__type__']=str(obj)
    for attr in newobj:
      newobj[attr]=dump(newobj[attr])
  return newobj

使い方はこちら

class stdClass(object): pass
obj=stdClass()
obj.int=1
obj.tup=(1,2,3,4)
obj.dict={'a':1,'b':2, 'c':3, 'more':{'z':26,'y':25}}
obj.list=[1,2,3,'a','b','c',[1,2,3,4]]
obj.subObj=stdClass()
obj.subObj.value='foobar'

from pprint import pprint
pprint(dump(obj))

そして結果。

{'__type__': '<__main__.stdClass object at 0x2b126000b890>',
 'dict': {'a': 1, 'c': 3, 'b': 2, 'more': {'y': 25, 'z': 26}},
 'int': 1,
 'list': [1, 2, 3, 'a', 'b', 'c', [1, 2, 3, 4]],
 'subObj': {'__type__': '<__main__.stdClass object at 0x2b126000b8d0>',
            'value': 'foobar'},
 'tup': (1, 2, 3, 4)}
15
Zoredache

古い話題ですが、試す価値があります。

これがシンプルで効率的なvar_dump関数です。

def var_dump(var, prefix=''):
    """
    You know you're a php developer when the first thing you ask for
    when learning a new language is 'Where's var_dump?????'
    """
    my_type = '[' + var.__class__.__+ '(' + str(len(var)) + ')]:'
    print(prefix, my_type, sep='')
    prefix += '    '
    for i in var:
        if type(i) in (list, Tuple, dict, set):
            var_dump(i, prefix)
        else:
            if isinstance(var, dict):
                print(prefix, i, ': (', var[i].__class__.__name__, ') ', var[i], sep='')
            else:
                print(prefix, '(', i.__class__.__name__, ') ', i, sep='')

出力例:

>>> var_dump(zen)

[list(9)]:
    (str) hello
    (int) 3
    (int) 43
    (int) 2
    (str) goodbye
    [list(3)]:
        (str) hey
        (str) oh
        [Tuple(3)]:
            (str) jij
            (str) llll
            (str) iojfi
    (str) call
    (str) me
    [list(7)]:
        (str) coucou
        [dict(2)]:
            oKey: (str) oValue
            key: (str) value
        (str) this
        [list(4)]:
            (str) a
            (str) new
            (str) nested
            (str) list
3
Jivan

print

あなた自身のクラスの場合は、__str__メソッドを定義するだけです。

2
Oli

PHPの経験はありませんが、Python標準ライブラリを理解しています。

あなたの目的のために、Pythonにはいくつかのメソッドがあります。

logging モジュール。

pickle と呼ばれるオブジェクト直列化モジュール。あなたはpickleモジュールのあなた自身のラッパーを書くことができます。

テストにvar_dumpを使用している場合、Pythonには独自の doctestunittest モジュールそれはデザインにとってとてもシンプルで速いです。

2

私は自分で書いたPrinterクラスを使いますが、dir()はインスタンスのフィールドや値を出力するのにも適しています。

class Printer:

       def __init__ (self, PrintableClass):
           for name in dir(PrintableClass):
               value = getattr(PrintableClass,name)
               if  '_' not in str(name).join(str(value)):
                    print '  .%s: %r' % (name, value)

使用例

Printer(MyClass)
1
Dmitry Nosov