所以我在这里寻找的是像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':, 'AssertionError': , 'AttributeError': , ... '_': [ 'ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'DeprecationWarning', ...
交互式调试器中还可以使用漂亮的打印作为命令:
(Pdb) pp vars() {'__builtins__': {'ArithmeticError':, 'AssertionError': , 'AttributeError': , 'BaseException': , 'BufferError': , ... 'zip': }, '__file__': 'pass.py', '__name__': '__main__'}
def dump(obj): for attr in dir(obj): print("obj.%s = %r" % (attr, getattr(obj, attr)))
有很多第三方功能可以根据作者的喜好添加异常处理,国家/特殊字符打印,嵌套对象递归等功能.但他们都基本归结为此.
dir已被提及,但这只会给你属性的名字.如果你想要他们的价值观,请尝试__dict__.
class O: def __init__ (self): self.value = 3 o = O()
这是输出:
>>> o.__dict__ {'value': 3}
您可以使用"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
要打印对象的当前状态,您可以:
>>> obj # in an interpreter
要么
print repr(obj) # in a script
要么
print obj
对于您的类定义__str__
或__repr__
方法.从Python文档:
__repr__(self)
由repr()
内置函数和字符串转换(反向引号)调用,以计算对象的"官方"字符串表示形式.如果可能的话,这应该看起来像一个有效的Python表达式,可用于重新创建具有相同值的对象(给定适当的环境).如果这不可能,则应返回"<......一些有用的描述...>"形式的字符串.返回值必须是字符串对象.如果一个类定义了repr()但是没有__str__()
,那么__repr__()
当需要该类的实例的"非正式"字符串表示时,也会使用它.这通常用于调试,因此表示信息丰富且明确是很重要的.
__str__(self)
由str()
内置函数和print语句调用,以计算对象的"非正式"字符串表示形式.这不同之处__repr__()
在于它不必是有效的Python表达式:可以使用更方便或简洁的表示.返回值必须是字符串对象.
可能值得一试 -
是否有与Perl的Data :: Dumper等效的Python?
我的建议是这个 -
https://gist.github.com/1071857
请注意,perl有一个名为Data :: Dumper的模块,它将对象数据转换回perl源代码(注意:它不会将代码转换回源代码,而且几乎总是不希望输出中的对象方法函数).这可以用于持久性,但共同的目的是用于调试.
标准的python pprint有很多东西无法实现,特别是当它看到一个对象的实例并且给你对象的内部十六进制指针时,它会停止下降(错误,该指针不是很多用途)方式).简而言之,python就是关于这个面向对象的伟大范例,但是你开箱即用的工具是为了处理除了对象以外的东西而设计的.
perl Data :: Dumper允许您控制您想要的深度,并且还可以检测循环链接结构(这非常重要).这个过程在perl中基本上更容易实现,因为对象除了祝福之外没有特别的魔力(一个普遍定义良好的过程).
在大多数情况下,使用__dict__
或dir()
将获得您想要的信息.如果您碰巧需要更多细节,标准库包括inspect模块,它可以让您获得一些令人印象深刻的细节.一些真正的信息提示包括:
函数名称和方法参数
类层次结构
函数/类对象的实现源代码
框架对象外的局部变量
如果你只是寻找"什么属性值没有我的对象有哪些?",然后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
它有点过时但仍在工作.
我建议使用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__.
如果您正在使用它进行调试,并且您只想要递归转储所有内容,那么接受的答案就不会令人满意,因为它要求您的类已经具有良好的__str__
实现.如果情况并非如此,那么效果会更好:
import json print(json.dumps(YOUR_OBJECT, default=lambda obj: vars(obj), indent=1))
这将以json或yaml缩进格式递归打印所有对象内容:
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)