这个问题在这里已有答案:
- 是否有内置函数来打印对象的所有当前属性和值? 23个答案
在PHP中调试时,我经常发现在我的代码中简单地插入var_dump()以向我展示变量是什么,它的值是什么,以及它包含的任何内容都是相同的。
什么是一个很好的Python相当于此?
#1楼
与PHP的var_dump()
最接近的是pprint()
和内置inspect
模块中的getmembers()
函数:
from inspect import getmembers
from pprint import pprint
pprint(getmembers(yourObj))
#2楼
我没有PHP经验,但我对Python标准库有所了解。
出于您的目的,Python有几种方法:
记录模块;
对象序列化模块,称为pickle 。 您可以编写自己的pickle模块包装器。
如果你使用var_dump
进行测试,Python有自己的doctest和unittest模块。 它的设计非常简单快捷。
#3楼
我使用自编写的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)
#4楼
我为PHP的var_dump编写了一个非常轻量级的替代品,以便在Python中使用并在以后使其成为开源。
GitHub: https : //github.com/sha256/python-var-dump
你可以使用pip
简单地安装它:
pip install var_dump
#5楼
老话题,但值得一试。
这是一个简单而有效的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
#6楼
我认为与PHP的var_dump($foo, $bar)
最相同的是将print
与vars
结合起来:
print vars(foo),vars(bar)
#7楼
print
对于您自己的类,只需定义一个__str__
方法
#8楼
要很好地显示值,可以使用pprint模块。 使用它转储所有变量的最简单方法就是这样做
from pprint import pprint
pprint(globals())
pprint(locals())
如果您在CGI中运行,那么一个有用的调试功能是cgitb模块,它将局部变量的值显示为回溯的一部分。
#9楼
PHP的var_export()通常显示对象的序列化版本,可以exec()重新创建对象。 最接近Python的是repr()
“对于许多类型,此函数尝试返回一个字符串,该字符串在传递给eval()时会产生具有相同值的对象[...]”
#10楼
所以我从这个问题和另一个问题中得到了答案,并在下面提出。 我怀疑这对于大多数人来说并不是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)}