本问题已经有最佳答案,请猛点这里访问。
在PHP中进行调试时,我经常发现在代码中简单地插入一个var_dump()来显示变量是什么,它的值是什么,以及它包含的任何内容都是一样的,这很有用。
一个好的python等价物是什么?
我发现这是为了寻找与pythons repr等效的php。谢谢。
重复的问题@hop提到(和投票最高的答案)对我来说更有用。
如果你发现自己经常使用这个函数,你可能会考虑使用一个有断点的远程调试器。一开始可能很难理解,但这会节省你未来的时间,一旦你知道如何去做,你就永远不会回去了。我知道Eclipse有一个好的,科莫多也有。docs.activestate.com/komodo/8.0/…
由于该线程已关闭,请参阅使用jsonpickle序列化的答案:stackoverflow.com/a/35804583/1081043
我认为与php的var_dump($foo, $bar)最好的等价物是将print与vars结合起来:
1print vars(foo),vars(bar)
这个答案可能比其他答案发布得晚,但对我来说仍然是最有帮助的答案。+ 1。
这里也一样,唯一能像我预期的那样工作的东西(比如var_dump)
看起来vars要工作,变量必须有字典信息,否则会得到"typeerror:vars()参数必须有uudict uuuu属性"。
这是为我做的-但我也喜欢这一点。这里有一个杂交种:pprint.pprint(vars(foo))。
-1,这只适用于某些类型的变量,而不是所有变量。改为考虑pprint或repr。
这个答案也适用于使用pp命令进行python pdb调试。如pp vars(my_dict)。它应该标记为正确,就像php var_dump()输出数据结构中的所有值一样,与py vars()输出的值一样。
注:对于python3,你需要使用像print( vars(foo) )这样的parens。
为了更好地显示值,可以使用pprint模块。用它来转储所有变量的最简单方法是
1
2
3
4from pprint import pprint
pprint(globals())
pprint(locals())
如果您在CGI中运行,一个有用的调试特性是CGITB模块,它将局部变量的值作为回溯的一部分显示出来。
如何显示VaR的类型?如空/无、字符串、对象..
在枚举对象、排列等方面,pprint()如何?
这很有帮助。我是一个python noob,但似乎有助于我的案例使用.__dict__,例如pprint(object.__dict__)。
object.__dict__输出对象的所有属性
最接近php的var_dump()的是pprint(),内置inspect模块中有getmembers()功能:
1
2
3from inspect import getmembers
from pprint import pprint
pprint(getmembers(yourObj))
php的var_export()通常显示对象的序列化版本,可以执行()以重新创建该对象。与Python中最接近的是repr()。
"对于许多类型,此函数尝试返回一个字符串,当传递给eval()[…]时,该字符串将生成具有相同值的对象。"
我想你在想江户记1〔4〕。
是的,php中的var_export和python中的repr有些关联——这是如果您想要某个对象的正式字符串表示——您可以使用repr()。为了让非官方的(读取人类可读的),您可以强制转换为string:str(object),它产生类似于php的print_r()的信息(比var_dump更常用于调试)。
请修正答案,不正确。如前所述,要么您在谈论var_export,要么以不同的方式描述var_dump()。
我编写了一个非常轻的PHP var_dump替代品,用于Python,并在稍后将其作为开放源代码。
github:https://github.com/sha256/python-var-dump
您只需使用pip安装即可:
1pip install var_dump
好工具,谢谢
简单而美好
设置失败-github.com/sha256/python-var-dump/issues/8
好了,这正是我一直在寻找的。
所以我从这个问题和另一个问题中得到了答案,并在下面列出。我怀疑这对大多数人来说还不够Python式的,但我真的想要一些能让我对一些未知变量的值有一个深刻的表示的东西。对于如何改进这一点或更容易实现相同行为的任何建议,我将不胜感激。
1
2
3
4
5
6
7
8
9
10def 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
11class 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,这是唯一一个在遇到对象时实际具有var_dump功能的答案。
+1非常有用,但它显示"if'dict'in dir(obj):"的错误,我可以使用"if'instance at"in str(obj)和obj更正。
老话题,但值得一试。
这里有一个简单有效的var_dump函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16def 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模块。它的设计非常简单快捷。
对于您自己的类,只需定义一个__str__方法
我使用自己编写的打印机类,但是dir()也很适合输出实例字段/值。
1
2
3
4
5
6
7class 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)
使用示例:
1Printer(MyClass)
如果"u"不在str(name).join(str(value)):^syntax错误:无效语法