在PHP中调试时,我经常发现在代码中插入var_dump()来显示变量是什么、它的值是什么以及它所包含的任何内容是很有用的。
Python中与之对应的是什么?
在PHP中调试时,我经常发现在代码中插入var_dump()来显示变量是什么、它的值是什么以及它所包含的任何内容是很有用的。
Python中与之对应的是什么?
当前回答
我认为最好的等效PHP的var_dump($foo, $bar)是结合打印与vars:
print vars(foo),vars(bar)
其他回答
我使用自己编写的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经验,但我了解Python标准库。
出于你的目的,Python有几个方法:
日志记录模块;
对象序列化模块,称为pickle。你可以自己编写pickle模块的包装器。
如果你使用var_dump进行测试,Python有自己的doctest和unittest模块。它的设计非常简单和快速。
所以我从这个问题和另一个问题中得到了答案。我怀疑这对大多数人来说不够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)}
PHP的var_export()通常显示对象的序列化版本,可以用exec()重新创建对象。Python中与此最接近的是repr()
"对于许多类型,此函数尝试返回一个字符串,当传递给eval()[…]时,该字符串将产生一个具有相同值的对象"
要很好地显示值,可以使用pprint模块。使用它转储所有变量的最简单方法是执行
from pprint import pprint
pprint(globals())
pprint(locals())
如果在CGI中运行,一个有用的调试特性是cgitb模块,它将局部变量的值作为回溯的一部分显示出来。