什么是PHP的var_dump()的Python等价物?
在PHP中进行debugging时,我经常发现在代码中简单地粘贴一个var_dump()来显示variables是什么,它的值是什么以及它包含的东西是相同的。
什么是一个好的Python相当于这个?
要很好地显示值,可以使用pprint模块。 转储所有variables最简单的方法就是做
from pprint import pprint pprint(globals()) pprint(locals())
如果您正在CGI中运行,则一个有用的debuggingfunction是cgitb模块,该模块将本地variables的值显示为回溯的一部分。
我认为相当于PHP的var_dump($foo, $bar)
是将print
和vars
结合起来:
print vars(foo),vars(bar)
与PHP的var_dump()
最接近的是pprint()
和getmembers()
函数在内置的inspect
模块中:
from inspect import getmembers from pprint import pprint pprint(getmembers(yourObj))
PHP的var_export()通常显示对象的序列化版本,可以通过exec()来重新创build对象。 在Python中最接近的是repr()
“对于很多types,这个函数会尝试返回一个string,当传递给eval()[…]时会产生一个具有相同值的对象”
所以我已经从这个问题的答案和另一个问题 ,下面来了。 我怀疑这对大多数人来说不够pythonic,但是我真的很想要让我深入了解一些未知variables的值。 我将不胜感激任何关于如何改善这一点或者更容易达到相同行为的build议。
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_dump来使用Python,并在稍后将其开源。
GitHub: https : //github.com/sha256/python-var-dump
你可以简单地使用pip
来安装它:
pip install var_dump
老主题,但值得一试。
这是一个简单而高效的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
print
对于你自己的类,只需要__str__
一个__str__
方法
我没有PHP的经验,但我有一个Python标准库的理解。
为了您的目的,Python有几种方法:
logging模块;
被称为pickle的对象序列化模块。 你可以编写你自己的pickle模块的包装。
如果你使用var_dump
进行testing,Python有自己的doctest和unittest模块。 这是非常简单和快速的devise。
我使用自写的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)
- 如何更改XSLTdebugging器的input文件?
- 如果多个文件具有相同的名称,则Visual Studio断点会在错误的源文件(或多个文件同时)中断裂
- 如何在xcode 5中通过推送通知启动时debugging应用程序
- Android Studio的debugging器不会在库模块中的断点处停止
- 我如何debuggingNode.js应用程序?
- 如何在Visual Studio中debugging外部类库项目?
- 用电脑debuggingipad safari
- 确保您的项目构build设置正在生成一个dSYM文件。 对于所有configuration,DEBUG_INFORMATION_FORMAT应该设置为dwarf-with-dsym
- 如何检查程序是否使用debugging符号编译?