什么是 PHP 的 var_dump() 的 Python 等价物? [复制]

Posted

技术标签:

【中文标题】什么是 PHP 的 var_dump() 的 Python 等价物? [复制]【英文标题】:What is a Python equivalent of PHP's var_dump()? [duplicate] 【发布时间】:2010-09-27 21:22:02 【问题描述】:

php 中进行调试时,我经常发现在我的代码中简单地粘贴 var_dump() 以向我展示变量是什么、它的值是什么以及它所包含的任何内容都是有用的。

什么是好的 Python 等价物?

【问题讨论】:

我发现这是在寻找 Python 的 repr 的 PHP 等价物。谢谢。 @hop 提到的重复问题(以及投票最高的答案)对我来说更有用 如果您发现自己经常使用此功能,您可能需要考虑使用带有断点的良好远程调试器。一开始可能很难理解,但它会为你节省未来的时间,一旦你知道如何去做,你就永远不会回去。我知道日食有一个很好的,科莫多也是。 docs.activestate.com/komodo/8.0/… 由于该线程已关闭,请参阅使用 jsonpickle 序列化的答案:***.com/a/35804583/1081043 【参考方案1】:

老话题,但值得一试。

这里有一个简单高效的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

【讨论】:

if type(i) in (list, tuple, dict, set): 似乎不起作用。传递对象时:TypeError: object of type 'TestPacketDecode' has no len()【参考方案2】:

要很好地显示一个值,您可以使用pprint 模块。用它转储所有变量的最简单方法是这样做

from pprint import pprint

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

如果您在 CGI 中运行,一个有用的调试功能是 cgitb 模块,它显示局部变量的值作为回溯的一部分。

【讨论】:

如何显示 var 的类型?比如 Null/None、String、Object.. pprint()enumerate 对象、permutations 等怎么样? 这很有帮助。我是一个 Python 菜鸟,但似乎对我的情况有所帮助的是使用 .__dict__,例如pprint(object.__dict__). object.__dict__ 输出对象的所有属性 var_dump 在 PHP 中不仅仅是“很好地显示一个值”?【参考方案3】:

我认为最好的相当于 PHP 的 var_dump($foo, $bar) 是将 printvars 结合起来:

print vars(foo),vars(bar)

【讨论】:

这里也一样,只有按我预期工作的东西(比如 var_dump) 看起来 vars 可以工作,变量必须有字典信息,否则你会得到“TypeError: vars() argument must have __ dict __ attribute”。 这是为我做的——但我也喜欢 pprint。这是一个混合体:pprint.pprint(vars(foo)). -1,这仅适用于某些类型的变量,而不是全部。改为考虑pprintrepr 注意:对于 python3,您需要使用括号,例如 print( vars(foo) )【参考方案4】:

我为 PHP 的 var_dump 编写了一个非常轻量级的替代方案,用于在 Python 中使用,并在以后将其开源。

GitHub:https://github.com/sha256/python-var-dump

您可以使用pip 简单地安装它:

pip install var_dump

【讨论】:

集合失败 - github.com/sha256/python-var-dump/issues/8 最好的解决方案,永远,这个实用程序运行良好,输出格式令人难以置信。我真的强烈推荐它!【参考方案5】:

本人没有PHP经验,但对Python标准库有所了解。

出于您的目的,Python 有几种方法:

logging模块;

对象序列化模块,称为pickle。您可以编写自己的 pickle 模块包装器。

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

【讨论】:

【参考方案6】:

与PHP 的var_dump() 最接近的是pprint(),内置getmembers() 模块中的getmembers() 函数:

from inspect import getmembers
from pprint import pprint
pprint(getmembers(yourObj))

【讨论】:

这样更好。【参考方案7】:

PHP 的var_export() 通常显示对象的序列化版本,可以通过 exec()'d 重新创建对象。在 Python 中最接近的是 repr()

“对于许多类型,此函数尝试返回一个字符串,该字符串在传递给 eval() 时会产生具有相同值的对象 [...]”

【讨论】:

我想你在想var_export 是的,php 中的 var_export 和 python 中的 repr 有点相关 - 如果你想要某个对象的官方字符串表示 - 你使用 repr()。为了获得非官方的(阅读人类可读的),您始终可以强制转换为字符串:str(object),它会产生类似于 php 的 print_r() 的信息(比 var_dump 更常用于调试)。 请修正答案,不正确。如前所述,您要么在谈论 var_export,要么以不同的方式描述 var_dump()。【参考方案8】:

我用的是自己写的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)

【讨论】:

如果 '_' 不在 str(name).join(str(value)) 中:^ SyntaxError: invalid syntax【参考方案9】:

所以我从这个问题和another question 中得到了答案并出现在下面。我怀疑这对大多数人来说还不够 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)

【讨论】:

+1,这是遇到对象时真正具有var_dump功能的唯一答案 +1 非常有用,但它显示错误“if 'dict' in dir(obj):”,我可以使用“if ' instance at ' in str(obj) 和 obj.__dict__:"【参考方案10】:

print

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

【讨论】:

以上是关于什么是 PHP 的 var_dump() 的 Python 等价物? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

PHP中var_dump 和dump的区别是啥????

[单选题]下面的语句将显示什么?<?php$var = "6";var_dump($var);$var++;var_dump($var);?>

php var_dump() 与 print_r()

PHP 中更漂亮/信息更丰富的 Var_dump 替代方案? [关闭]

var_dump 之前的 php <br> 不产生换行符

php中的var_dump之类的函数