是否有一个内置函数来打印一个对象的所有当前属性和值?
所以我在这里找的是像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))