是否有内置功能可以打印对象的所有当前属性和值?

所以我在这里寻找的是类似 PHP 的print_r函数。

这样一来,我可以通过查看问题对象的状态来调试脚本。

答案

from pprint import pprint
pprint(vars(your_object))
>>> 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',
...
(Pdb) pp vars()
{'__builtins__': {'ArithmeticError': <type 'exceptions.ArithmeticError'>,
                  'AssertionError': <type 'exceptions.AssertionError'>,
                  'AttributeError': <type 'exceptions.AttributeError'>,
                  'BaseException': <type 'exceptions.BaseException'>,
                  'BufferError': <type 'exceptions.BufferError'>,
                  ...
                  'zip': <built-in function zip>},
 '__file__': 'pass.py',
 '__name__': '__main__'}
def dump(obj):
  for attr in dir(obj):
    print("obj.%s = %r" % (attr, getattr(obj, attr)))
class O:
   def __init__ (self):
      self.value = 3

o = O()
>>> o.__dict__

{'value': 3}
>>> 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
>>> obj # in an interpreter
print repr(obj) # in a script
print obj

可能值得一看 -

是否有与 Perl 的 Data :: Dumper 等效的 Python?

我的建议是

https://gist.github.com/1071857

请注意,perl 有一个称为 Data :: Dumper 的模块,该模块可将对象数据转换回 perl 源代码(注意:它不会将代码转换回源代码,并且几乎总是不希望输出中的对象方法功能)。可以将其用于持久性,但是常见的目的是用于调试。

标准 python pprint 有很多无法实现的功能,特别是当它看到一个对象的实例并为您提供该对象的内部十六进制指针时,它只会停止下降(错误,该指针不是很多使用方式)。简而言之,python 就是关于这种伟大的面向对象范例的全部内容,但是开箱即用的工具是为处理对象以外的其他事物而设计的。

perl Data :: Dumper 允许您控制要深入的深度,还可以检测圆形链接结构(这非常重要)。从根本上讲,此过程在 perl 中更容易实现,因为对象没有祝福以外的任何魔力(普遍定义的过程)。

在大多数情况下,使用__dict__dir()会为您提供所需的信息。如果您碰巧需要更多详细信息,则标准库包含检查模块,可让您获得一些令人印象深刻的详细信息。真正真正的信息包括:

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

如果您只是在寻找 “我的对象有哪些属性值?”,那么dir()__dict__可能就足够了。如果您真的想深入研究任意对象的当前状态(请记住,在 python 中几乎所有对象都是对象),那么inspect是值得考虑的。

$ 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>
$ 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>

我建议使用help(your_object)

help(dir)

If called without an argument, return the names in the current scope.
 Else, return an alphabetized list of names comprising (some of) the attributes
 of the given object, and of attributes reachable from it.
 If the object supplies a method named __dir__, it will be used; otherwise
 the default dir() logic is used and returns:
 for a module object: the module's attributes.
 for a class object:  its attributes, and recursively the attributes
 of its bases.
 for any other object: its attributes, its class's attributes, and
 recursively the attributes of its class's base classes.

help(vars)

Without arguments, equivalent to locals().
With an argument, equivalent to object.__dict__.