Python中与php的var_dump()等价的是什么?

当在PHP中调试时,我经常发现在我的代码中插入var_dump ()来告诉我变量是什么,它的值是什么,以及它包含的任何内容都是一样的,这很有用。

Python中与之对应的是什么?

348736 次浏览

print

对于你自己的类,只需要定义一个__str__方法

为了更好地显示值,你可以使用pprint模块。使用它转储所有变量的最简单方法是执行

from pprint import pprint


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

如果你在CGI中运行,一个有用的调试特性是cgitb模块,它显示局部变量的值作为回溯的一部分。

PHP的var_export ()通常显示对象的序列化版本,可以用exec()'d来重新创建对象。Python中最接近的是repr ()

"对于许多类型,此函数尝试返回一个字符串,当传递给eval()[…]时,该字符串将产生一个具有相同值的对象"

所以我从这个问题和另一个问题中得到了答案,并在下面列出。我怀疑这对大多数人来说不够python,但我确实想要一些东西,让我得到某个未知变量的值的深层表示。我很感激任何关于我如何改进或更容易实现相同行为的建议。

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)}

我使用自己编写的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)

我认为最好的等价于PHP的var_dump($foo, $bar)是结合printvars:

print vars(foo),vars(bar)

PHPvar_dump()最接近的是内置inspect模块中带有getmembers()函数的pprint():

from inspect import getmembers
from pprint import pprint
pprint(getmembers(yourObj))

我没有PHP经验,但我了解Python标准库。

出于你的目的,Python有几个方法:

日志记录模块;

对象序列化模块,称为泡菜。你可以自己编写pickle模块的包装器。

如果你使用var_dump进行测试,Python有自己的doctestunittest模块。它的设计非常简单和快速。

我写了一个非常轻量级的替代PHP的var_dump在Python中使用的替代品,后来使它成为开源的。

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

你可以简单地使用pip安装它:

pip install var_dump

使用的例子:

from var_dump import var_dump


var_dump(1, {"testkey1": "testval1", "testkey2": "testval2".encode("ascii")},
["testval"], "test", "test".encode("ascii"), set([1,2,3]))

打印

#0 int(1)
#1 dict(2)
['testkey1'] => str(8) "testval1"
['testkey2'] => object(bytes) (b'testval2')
#2 list(1)
[0] => str(7) "testval"
#3 str(4) "test"
#4 object(bytes) (b'test')
#5 object(set) ({1, 2, 3})

老话题了,但值得一试。

下面是一个简单有效的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__.__name__ + '(' + 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