PHPでデバッグするとき、私はコードに var_dump() を単に付けて変数が何であるか、その値が何であるかを示すのが便利だとよく思いますそれに含まれるものはすべて同じです。
これと同等の優れたPythonとは何ですか?
PHP のvar_dump()
に最も近いものは、組み込みinspect
モジュールのpprint()
関数を持つgetmembers()
です。
from inspect import getmembers
from pprint import pprint
pprint(getmembers(yourObj))
PHPの var_export() は通常、オブジェクトを再作成するためにexec()することができる直列化されたバージョンのオブジェクトを表示します。 Pythonのそれに最も近いものは repr() です。
「多くの型で、この関数はeval()[...]に渡されたときに同じ値を持つオブジェクトを生成する文字列を返そうとします。」
私はPythonで使うためにPHPのvar_dumpに代わる非常に軽量なものを書き、それを後でオープンソースにしました。
GitHub: https://github.com/sha256/python-var-dump
pip
を使って簡単にインストールできます。
pip install var_dump
だから私はこの質問と 別の質問 から答えを取り、以下に思いつきました。私はこれがほとんどの人にとって十分な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)}
古い話題ですが、試す価値があります。
これがシンプルで効率的な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
print
あなた自身のクラスの場合は、__str__
メソッドを定義するだけです。
私は自分で書いた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)