python与php的var_dump()是什么等价物?

What is a Python equivalent of PHP's var_dump()?

本问题已经有最佳答案,请猛点这里访问。

在PHP中进行调试时,我经常发现在代码中简单地插入一个var_dump()来显示变量是什么,它的值是什么,以及它包含的任何内容都是一样的,这很有用。

一个好的python等价物是什么?


我认为与php的var_dump($foo, $bar)最好的等价物是将printvars结合起来:

1
print vars(foo),vars(bar)


为了更好地显示值,可以使用pprint模块。用它来转储所有变量的最简单方法是

1
2
3
4
from pprint import pprint

pprint(globals())
pprint(locals())

如果您在CGI中运行,一个有用的调试特性是CGITB模块,它将局部变量的值作为回溯的一部分显示出来。


最接近php的var_dump()的是pprint(),内置inspect模块中有getmembers()功能:

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

您只需使用pip安装即可:

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)}


老话题,但值得一试。

这里有一个简单有效的var_dump函数:

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。您可以编写自己的泡菜模块包装器。

如果您使用var_dump进行测试,那么python有自己的doctest和unittest模块。它的设计非常简单快捷。


print

对于您自己的类,只需定义一个__str__方法


我使用自己编写的打印机类,但是dir()也很适合输出实例字段/值。

1
2
3
4
5
6
7
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)

使用示例:

1
Printer(MyClass)