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

所以我在这里找的是像PHP的print_r函数。 这样我就可以通过查看有问题的对象的状态来debugging我的脚本。

你真的把两个不同的东西混合在一起。

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

漂亮的打印也可以在交互式debugging器中作为命令使用:

 (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__'} 

你想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))) 

这里有许多第三方function,根据作者的偏好添加exception处理,国家/特殊字符打印,recursion嵌套对象等等。 但他们都基本归结为此。

dir已被提及,但是这只会给你属性的名字。 如果你想要他们的值,以及尝试__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文档 :

__repr__(self)repr()内置函数和string转换(反引号__repr__(self)调用来计算对象的“官方”string表示forms。 如果可能的话,这应该看起来像一个有效的Pythonexpression式,可以用来重新创build一个具有相同值的对象(给定一个合适的环境)。 如果这是不可能的,应该返回一个forms为“<…一些有用的描述…”的string。 返回值必须是一个string对象。 如果一个类定义了repr ()而不是__str__() ,那么当需要该类的实例的“非正式”string表示时,也会使用__repr__() 。 这通常用于debugging,因此重要的是表示信息丰富和明确。

__str__(self)str()内置函数和print语句调用,以计算对象的“非正式”string表示forms。 这与__repr__()不同之处在于,它不一定是有效的Pythonexpression式:可以使用更方便或简洁的表示。 返回值必须是一个string对象。

您可以使用“dir()”function来执行此操作。

 >>> 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'] >>> 

另一个有用的function是帮助。

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

可能值得一试 –

是否有一个相当于Perl的Data :: Dumper的Python?

我的build议是这样的 –

https://gist.github.com/1071857

请注意,perl有一个名为Data :: Dumper的模块,它将对象数据转换回perl源代码(注意:它不会将代码转换回源代码,并且几乎总是不需要输出中的对象方法函数)。 这可以用于持久性,但共同的目的是debugging。

有很多标准的python pprint无法实现,特别是当它看到一个对象的实例时,它会停止下降,并给出对象的内部hex指针(errr,该指针不是被大量使用方式)。 所以简而言之,python就是关于这个伟大的面向对象的范例,但是你开箱即用的工具被devise用来处理除了对象以外的东西。

perl的Data :: Dumper允许你控制你想要去的深度,还可以检测循环链接结构(这真的很重要)。 这个过程在perl中基本上更容易实现,因为对象没有特别的魔法超越他们的祝福(一个普遍明确的过程)。

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

  • 函数和方法参数的名称
  • 类层次结构
  • 一个函数/类对象的实现的源代码
  • 局部variables出框架对象

如果你只是在寻找“我的对象有什么属性值?”,那么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> 

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

这是有点过时,但仍然工作。

我需要在某些日志中打印DEBUG信息,无法使用pprint,因为它会打破它。 相反,我这样做,并得到几乎相同的东西。

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

转储“myObject”:

 from bson import json_util import json print(json.dumps(myObject, default=json_util.default, sort_keys=True, indent=4, separators=(',', ': '))) 

我尝试了vars()和dir(); 两者都失败了我正在寻找。 vars()没有工作,因为对象没有__dict__(exceptions.TypeError:vars()参数必须有__dict__属性)。 dir()不是我正在寻找的东西:它只是字段名称的列表,不会给出值或对象结构。

我认为json.dumps()将适用于大多数没有默认= json_util.default的对象,但是我在对象中有一个date时间字段,所以标准的json序列化器失败了。 请参阅如何克服在Python中的“datetime.datetime不JSON序列化”?

 from pprint import pprint def print_r(the_object): print ("CLASS: ", the_object.__class__.__name__, " (BASE CLASS: ", the_object.__class__.__bases__,")") pprint(vars(the_object)) 

如果你正在使用它进行debugging,而你只是想要一个recursion的转储,接受的答案是令人不满意的,因为它要求你的类已经有了很好的__str__实现。 如果情况并非如此,那么效果会更好:

 import json print(json.dumps(YOUR_OBJECT, default=lambda obj: vars(obj), indent=1)) 

pprint包含一个“漂亮的打印机”,用于生成美观的数据结构表示。 格式化程序产生数据结构的表示,可以被解释器正确地parsing,而且对于人类来说也是容易阅读的。 如果可能的话,输出保留在一行上,并在多行分割时缩进。

为什么不简单:

 for key,value in obj.__dict__.iteritems(): print key,value 

试试吧,

它不仅可以帮助您打印对象variables,还可以输出漂亮的内容,如下所示:

 class(NormalClassNewStyle): dicts: { }, lists: [], static_props: 1, tupl: (1, 2) 

这将以json或yaml缩进格式recursion打印所有对象内容:

 import jsonpickle # pip install jsonpickle import json import yaml # pip install pyyaml serialized = jsonpickle.encode(obj, max_depth=2) # max_depth is optional print json.dumps(json.loads(serialized), indent=4) print yaml.dump(yaml.load(serialized), indent=4) 

尝试ppretty

 from ppretty import ppretty class A(object): s = 5 def __init__(self): self._p = 8 @property def foo(self): return range(10) print ppretty(A(), show_protected=True, show_static=True, show_properties=True) 

输出:

 __main__.A(_p = 8, foo = [0, 1, ..., 8, 9], s = 5) 

我已经upvoted只提到pprint的答案。 清楚的是,如果你想看到一个复杂的数据结构中的所有 ,那么做一些事情:

 from pprint import pprint pprint(my_var) 

my_var是你感兴趣的variables。 当我使用pprint(vars(my_var))时,我什么也没得到,其他的答案没有帮助,或者这个方法看起来不必要的长。 顺便说一句,在我的具体情况下,我正在检查的代码有一本字典字典。

值得指出的是,对于某些自定义类,您最终可能会得到一个无用的<someobject.ExampleClass object at 0x7f739267f400>types的输出。 在这种情况下,你可能需要实现一个__str__方法,或者尝试一些其他的解决scheme。 我仍然想find一些简单的方法,可以在所有场景下工作,而不需要第三方库。

您可以尝试Flaskdebugging工具栏。
https://pypi.python.org/pypi/Flask-DebugToolbar

 from flask import Flask from flask_debugtoolbar import DebugToolbarExtension app = Flask(__name__) # the toolbar is only enabled in debug mode: app.debug = True # set a 'SECRET_KEY' to enable the Flask session cookies app.config['SECRET_KEY'] = '<replace with a secret key>' toolbar = DebugToolbarExtension(app) 

我喜欢使用python对象内置types键或值 。

对于属性,无论它们是方法还是variables:

 o.keys() 

对于这些属性的值:

 o.values() 

每个人都在苦苦挣扎

  • vars()不返回所有属性。
  • dir()不返回属性的值。

下面的代码用它们的值打印obj 所有属性:

 for attr in dir(obj): try: print("obj.{} = {}".format(attr, getattr(obj, attr))) except AttributeError: print("obj.{} = ?".format(attr))