在PHP中调试时,我经常发现在我的代码中简单地插入var_dump()以向我展示变量是什么,它的值是什么,以及它包含的任何内容都是相同的.
什么是一个很好的Python相当于此?
我认为最好的等同于PHP的var_dump($foo, $bar)
是结合print
使用vars
:
print vars(foo),vars(bar)
要很好地显示值,可以使用pprint模块.使用它转储所有变量的最简单方法就是这样做
from pprint import pprint pprint(globals()) pprint(locals())
如果您在CGI中运行,那么一个有用的调试功能是cgitb模块,它将局部变量的值显示为回溯的一部分.
与PHP最接近的var_dump()
是内置模块中pprint()
的getmembers()
函数inspect
:
from inspect import getmembers from pprint import pprint pprint(getmembers(yourObj))
PHP的var_export()通常显示对象的序列化版本,可以exec()重新创建对象.最接近Python的是repr()
"对于许多类型,此函数尝试返回一个字符串,该字符串在传递给eval()时会产生具有相同值的对象[...]"
我为PHP的var_dump编写了一个非常轻量级的替代品,以便在Python中使用并在以后使其成为开源.
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)}