others - Python有没有函数打印当前对象的所有属性和值?

我想找一个和PHP的print_r类似的函数,这样我就可以通过查看对象的状态来调试脚本。

时间:

使用dir()vars()inspect模块获取你感兴趣的内容(我使用__builtins__作为例子); 你可以使用任何对象。


>>> l = dir(__builtins__)
>>> d = __builtins__.__dict__

根据你喜欢的方式打印该词典:


>>> print l
['ArithmeticError', 'AssertionError', 'AttributeError',...

或者


>>> from pprint import pprint
>>> pprint(l)
['ArithmeticError',
 'AssertionError',
 'AttributeError',
 'BaseException',
 'DeprecationWarning',
...

>>> pprint(d, indent=2)
{ 'ArithmeticError': <type 'exceptions.ArithmeticError'>,
 'AssertionError': <type 'exceptions.AssertionError'>,
 'AttributeError': <type 'exceptions.AttributeError'>,
...
 '_': [ 'ArithmeticError',
 'AssertionError',
 'AttributeError',
 'BaseException',
 'DeprecationWarning',
...

你想要的是vars ()与pprint的混合:


from pprint import pprint
pprint (vars(your_object))


def dump(obj):
 for attr in dir(obj):
 print"obj.%s = %s" % (attr, getattr(obj, attr))

如果还需要它们的值,请尝试__dict__ 。


class O:
 def __init__ (self):
 self.value = 3

o = O()

> > > o.__dict__

{'value': 3}

要打印对象的当前状态,请执行以下操作:


>>> obj # in an interpreter

或者


print repr(obj) # in a script

或者

 
print obj

 

对于类,定义__str____repr__方法,从python文档

你可以使用"dir()"函数来执行这个操作。


>>> import sys
>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__stderr__', '__stdin__', '__stdo
t__', '_current_frames', '_getframe', 'api_version', 'argv', 'builtin_module_names', 'byteorder
, 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle', 'exc_clear', 'exc_info'
 'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'getcheckinterval', 'getdefault
ncoding', 'getfilesystemencoding', 'getrecursionlimit', 'getrefcount', 'getwindowsversion', 'he
version', 'maxint', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_
ache', 'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setprofile', 'setrecursionlimit
, 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoption
', 'winver']
>>>


>>> help(sys)
Help on built-in module sys:

NAME
 sys

FILE
 (built-in)

MODULE DOCS
 http://www.python.org/doc/current/lib/module-sys.html

DESCRIPTION
 This module provides access to some objects used or maintained by the
 interpreter and to functions that interact strongly with the interpreter.

 Dynamic objects:

 argv -- command line arguments; argv[0] is the script pathname if known

也许值得检查- -

是否有 python 等价于perl的Data::Dumper

我的建议是- -

https://gist.github.com/1071857

注意,perl有一个名为 Data::Dumper的模块,它将对象数据转换回perl源代码( NB: 它不会将代码转换回源代码,而且几乎总是不希望输出中的对象方法函数。 这可以用于持久性,但通用目的是调试。

有许多标准的python pprint无法实现,特别是当它看到一个对象的实例并给你对象的内部十六进制指针时,它就会停止下降。 以外的其他一些同objects,所以,概括来说,python 都是关于这个伟大的面向对象的范例,但是你有开箱即用的工具是专为工作后。

perl Data::Dumper 允许你控制你想去的深度,并检测循环链接结构( 那真的很重要) 。 这个过程在perl中很容易实现,因为对象除了它们的( 一个普遍定义好的流程) 之外没有特殊的魔力。

$ cat dump.py

#!/usr/bin/python
import sys
if len(sys.argv) > 2:
 module, metaklass = sys.argv[1:3]
 m = __import__(module, globals(), locals(), [metaklass])
 __metaclass__ = getattr(m, metaklass)

class Data:
 def __init__(self):
 self.num = 38
 self.lst = ['a','b','c']
 self.str = 'spam'
 dumps = lambda self: repr(self)
 __str__ = lambda self: self.dumps()

data = Data()
print data

没有参数:

$ python dump.py

<__main__.Data instance at 0x00A052D8>

Gnosis Utils :

$ python dump.py gnosis.magic MetaXMLPickler

<?xml version="1.0"?>
<!DOCTYPE PyObject SYSTEM"PyObjects.dtd">
<PyObject module="__main__" class="Data" id="11038416">
<attr name="lst" type="list" id="11196136" >
 <item type="string" value="a" />
 <item type="string" value="b" />
 <item type="string" value="c" />
</attr>
<attr name="num" type="numeric" value="38" />
<attr name="str" type="string" value="spam" />
</PyObject>

有点过时但仍在工作。

在大多数情况下,使用__dict__dir()将获得你想要的信息,如果你需要更多细节,那么标准库包括inspect模块,这使你得以获得一些细节,

  • 函数和方法参数的名称
  • 类层次结构
  • 函数/类对象的实现的源代码
  • 框架对象中的局部变量

如果你只是在寻找"对象有哪些属性值",那么dir()和__dict__就足够了。

我需要在一些日志中打印DEBUG信息,无法使用pprint,因为会破坏它,我写了这个,得到了同样的结果。


DO = DemoObject()

itemDir = DO.__dict__

for i in itemDir:
 print '{0} : {1}'.format(i, itemDir[i])

...