What is a Python equivalent of PHP's var_dump()?
在PHP中进行调试时,我经常发现在代码中简单地插入一个var_dump()来显示变量是什么,它的值是什么,以及它包含的任何内容都是一样的,这很有用。
一个好的python等价物是什么?
我认为与php的
1 | print vars(foo),vars(bar) |
为了更好地显示值,可以使用pprint模块。用它来转储所有变量的最简单方法是
1 2 3 4 | from pprint import pprint pprint(globals()) pprint(locals()) |
如果您在CGI中运行,一个有用的调试特性是CGITB模块,它将局部变量的值作为回溯的一部分显示出来。
最接近php的
1 2 3 | from inspect import getmembers from pprint import pprint pprint(getmembers(yourObj)) |
php的var_export()通常显示对象的序列化版本,可以执行()以重新创建该对象。与Python中最接近的是repr()。
"对于许多类型,此函数尝试返回一个字符串,当传递给eval()[…]时,该字符串将生成具有相同值的对象。"
我编写了一个非常轻的PHP var_dump替代品,用于Python,并在稍后将其作为开放源代码。
github:https://github.com/sha256/python-var-dump
您只需使用
1 | pip install var_dump |
所以我从这个问题和另一个问题中得到了答案,并在下面列出。我怀疑这对大多数人来说还不够Python式的,但我真的想要一些能让我对一些未知变量的值有一个深刻的表示的东西。对于如何改进这一点或更容易实现相同行为的任何建议,我将不胜感激。
1 2 3 4 5 6 7 8 9 10 | 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 |
这是用法
1 2 3 4 5 6 7 8 9 10 11 | 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)) |
以及结果。
1 2 3 4 5 6 7 | {'__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)} |
老话题,但值得一试。
这里有一个简单有效的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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='') |
样品输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | >>> 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 |
我没有PHP经验,但我了解Python标准库。
出于您的目的,python有几种方法:
测井模块;
对象序列化模块,称为pickle。您可以编写自己的泡菜模块包装器。
如果您使用
对于您自己的类,只需定义一个
我使用自己编写的打印机类,但是dir()也很适合输出实例字段/值。
1 2 3 4 5 6 7 |
使用示例:
1 | Printer(MyClass) |