python对象的通用漂亮打印机
printobject的Python项目详细描述
python版本支持:cpython 2.6、2.7、3.2、3.3和pypy。
安装
$ pip install printobject
用法
标准库pprint模块非常擅长可视化各种 内置类型,如列表、dict和元组。但它并不试图 内省用户定义的类型。这里是printobject进来的地方。它 将任何对象的内部转储为dict,并使用 pprint。
要点:
- 任何类型的对象都可以打印,但取决于输出的类型 会或多或少有见地。
- 对象内省是基于使用dir而不是__dict__ 直接的。
- 对象属性只包括对象拥有的属性,忽略 类属性。
- 内省对象时省略可调用项。目标是形象化 对象中的数据。
- 合成属性___name___和___type___(是的,这是三个 下划线!!!)是为了提供有关 正在打印的对象。
模块
这个模块在模块级定义了许多test_xxx函数。他们 包含在tests列表中,在输出中可见,但未列出 因为它们是可调用的。
>>>importsys>>>fromprintobjectimportpp>>>pp(sys.modules[__name__]){'___name___':'__main__','___type___':'<module {id0}>','__builtins__':<module'builtins'(built-in)>,'__cached__':None,'__file__':'/home/user/code/printobject/printobject/demos.py','__loader__':<_frozen_importlib.SourceFileLoaderobjectat0xb71c520c>,'__name__':'__main__','__package__':'printobject','absolute_import':_Feature((2,5,0,'alpha',1),(3,0,0,'alpha',0),16384),'defaults':('Module',),'re':<module're'from'/home/user/code/printobject/.tox/py33/lib/python3.3/re.py'>,'sys':<module'sys'(built-in)>,'tests':[<functiontest_moduleat0xb72d23d4>,<functiontest_classat0xb71c60bc>,<functiontest_instanceat0xb71c6104>,<functiontest_instance_collapsedat0xb71c614c>,<functiontest_class_oldat0xb71c6194>,<functiontest_instance_oldat0xb71c61dc>,<functiontest_instance_old_collapsedat0xb71c6224>,<functiontest_functionat0xb71c626c>,<functiontest_methodat0xb71c62b4>,<functiontest_lambdaat0xb71c62fc>,<functiontest_iterableat0xb71c6344>,<functiontest_generatorat0xb71c638c>]}
课程
>>>classNode(object):...classatt='hidden'...def__init__(self,name):...self.name=name>>>fromprintobjectimportpp>>>pp(Node){'___name___':'Node','___type___':'<type {id0}>','__weakref__':{'___name___':'__weakref__','___type___':'<getset_descriptor {id1}>'},'classatt':"'hidden'"}
实例
对象图通常不是完全无环的。循环存在的地方通常不存在。 展开它们很有意义,这样会显示多次遇到的对象 使用dup标记。对象也会被分配id,因此在这种情况下 下面很明显的是dup <Node {id0}>,它出现在refs 属性c引用的是a。
>>>a,b,c,d=Node('A'),Node('B'),Node('C'),Node('D')>>>a.refs=[b,d]>>>b.refs=[c]>>>c.refs=[a]>>>d.refs=[c]>>>fromprintobjectimportpp>>>pp(a){'___type___':'<Node {id0}>','name':"'A'",'refs':[{'___type___':'<Node {id1}>','name':"'B'",'refs':[{'___type___':'<Node {id2}>','name':"'C'",'refs':['dup <Node {id0}>']}]},{'___type___':'<Node {id3}>','name':"'D'",'refs':[{'___type___':'<Node {id2}>','name':"'C'",'refs':['dup <Node {id0}>']}]}]}
在上面的示例中,c以展开形式打印两次,因为两者都是 出现在相同的递归级别。这可以使输出 如果同一个对象被多次引用,那么 另一种方法是只在第一次扩展它并发出dup条目 随后,如下所示。
>>>pp(a,collapse_duplicates=True){'___type___':'<Node {id0}>','name':"'A'",'refs':[{'___type___':'<Node {id1}>','name':"'B'",'refs':[{'___type___':'<Node {id2}>','name':"'C'",'refs':['dup <Node {id0}>']}]},{'___type___':'<Node {id3}>','name':"'D'",'refs':['dup <Node {id2}>']}]}
旧式类(仅限python 2.x)
>>>classNode():...classatt='hidden'...def__init__(self,name):...self.name=name>>>fromprintobjectimportpp>>>pp(Node){'___name___':'Node','___type___':'<classobj {id0}>','__module__':"'__main__'",'classatt':"'hidden'"}
旧式实例(仅限python 2.x)
旧式类的实例与 新样式类的实例。不同的是他们 标识为instance类型,在 ___type___值。
>>>a,b,c,d=Node('A'),Node('B'),Node('C'),Node('D')>>>a.refs=[b,d]>>>b.refs=[c]>>>c.refs=[a]>>>d.refs=[c]>>>fromprintobjectimportpp>>>pp(a){'___type___':'<instance {id0}>','__module__':"'__main__'",'classatt':"'hidden'",'name':"'A'",'refs':[{'___type___':'<instance {id1}>','__module__':"'__main__'",'classatt':"'hidden'",'name':"'B'",'refs':[{'___type___':'<instance {id2}>','__module__':"'__main__'",'classatt':"'hidden'",'name':"'C'",'refs':['dup <instance {id0}>']}]},{'___type___':'<instance {id3}>','__module__':"'__main__'",'classatt':"'hidden'",'name':"'D'",'refs':[{'___type___':'<instance {id2}>','__module__':"'__main__'",'classatt':"'hidden'",'name':"'C'",'refs':['dup <instance {id0}>']}]}]}
以折叠形式:
>>>pp(a,collapse_duplicates=True){'___type___':'<instance {id0}>','__module__':"'__main__'",'classatt':"'hidden'",'name':"'A'",'refs':[{'___type___':'<instance {id1}>','__module__':"'__main__'",'classatt':"'hidden'",'name':"'B'",'refs':[{'___type___':'<instance {id2}>','__module__':"'__main__'",'classatt':"'hidden'",'name':"'C'",'refs':['dup <instance {id0}>']}]},{'___type___':'<instance {id3}>','__module__':"'__main__'",'classatt':"'hidden'",'name':"'D'",'refs':['dup <instance {id2}>']}]}
可赎回
callables也可以打印,但是它们没有那么有趣,因为它们 没有公共属性。
功能:
>>>fromprintobjectimportpp>>>pp(pp){'___name___':'pp','___type___':'<function {id0}>'}
方法:
>>>fromprintobjectimportDumper>>>pp(Dumper.dump){'___name___':'dump','___type___':'<instancemethod {id0}>'}
兰姆达斯:
>>>pp(lambdax:x){'___name___':'<lambda>','___type___':'<function {id0}>'}
可吸入气体
iterable使用它们的标准__repr__打印。在这种情况下 没有合成___type___和___name___属性 在输出中。
>>>it=frozenset(range(10))>>>fromprintobjectimportpp>>>pp(it)['0','1','2','3','4','5','6','7','8','9']
发电机
生成器是iterables的特例,因为这些值是 动态创建。如果没有 展开它们,这样它们将首先实现。但这意味着 如果生成器是无限的,函数将永远不会返回。
>>>gen=(xforxinrange(10))>>>fromprintobjectimportpp>>>pp(gen)['0','1','2','3','4','5','6','7','8','9']