python对象的通用漂亮打印机

printobject的Python项目详细描述


https://badge.fury.io/py/printobject.pnghttps://travis-ci.org/numerodix/printobject.png?branch=masterhttps://pypip.in/license/printobject/badge.png

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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
从源WSO2标识服务器生成时发生java错误   java如何在icefaces项目中启用url   java将堆栈中的每个元素打印到文本文件中的新行   java如何将导航抽屉的所有片段放在全屏上?   java EHCache如何实现其事务?   Selenide中的java捕获shouldHave/shouldBe方法   从CSV文件读取java   java如何在ListView行中显示长文本视图高度?   java Tapestry内部重定向到静态页面   TFS使用Java和Eclipse构建   多线程Java线程是否可以在已经持有锁的情况下获得锁?   JavaSwing:使用文档侦听器处理返回键   java在Moshi中保存对象关系