协慌网

登录 贡献 社区

是否有内置函数来打印对象的所有当前属性和值?

所以我在这里寻找的是像 PHP 的print_r函数。这样我就可以通过查看相关对象的状态来调试我的脚本。

答案

你想要vars()pprint()混合:

from pprint import pprint
pprint(vars(your_object))

你真的把两件事混在了一起。

使用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',
...

交互式调试器中还可以使用漂亮的打印作为命令:

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

有很多第三方功能可以根据作者的喜好添加异常处理,国家 / 特殊字符打印,嵌套对象递归等功能。但他们都基本归结为此。