Python pprint 问题
我在使用Google App Engine环境中的User对象,刚刚尝试了以下代码:
pprint(user)
print vars(user)
结果是:
pprint(user)
users.User(email='test@example.com',_user_id='18580000000000')
print vars(user)
{'_User__federated_identity': None, '_User__auth_domain': 'gmail.com',
'_User__email': 'test@example.com', '_User__user_id': '1858000000000',
'_User__federated_provider': None}
这里有几个问题(抱歉有点多):
- 为什么我看不到对象中的所有变量?它没有显示
auth_domain
这个有值的变量? - 有没有办法列出那些值为None的属性?None是一个合法的值,为什么它把这些属性当成不存在的呢?
- 有没有办法让pprint在属性之间换行?
3 个回答
1
关于问题3,“有没有办法让pprint在属性之间换行?”:
在Python文档中有这样的描述:
格式化的表示方式会尽量把对象放在一行上,如果放不下,就会换到多行。
这里的“宽度”属性(在初始化时可以设置)就是用来指定允许的宽度。我把我的设置成了width=1,这样就能达到效果。
举个例子:
pretty = pprint.PrettyPrinter(indent=2)
结果是...
{ 'acbdf': { 'abdf': { 'c': { }}, 'cbdf': { 'bdf': { 'c': { }}, 'cbd': { }}},
'cef': { 'abd': { }}}
而
pretty = pprint.PrettyPrinter(indent=2,width=1)
结果是...
{ 'acbdf': { 'abdf': { 'c': { }},
'cbdf': { 'bdf': { 'c': { }},
'cbd': { }}},
'cef': { 'abd': { }}}
希望这能帮到你。
3
有几种方法可以在这种对象的打印输出中实现不同的换行效果。
示例数据:
d = dict(a=1, b=2, c=dict(d=3, e=[4, 5, 6], f=dict(g=7)), h=[8,9,10])
标准打印,没有友好的间距:
>>> print d
{'a': 1, 'h': [8, 9, 10], 'c': {'e': [4, 5, 6], 'd': 3, 'f': {'g': 7}}, 'b': 2}
这里有两种可能的解决方案:
(1) 使用 pprint
并设置 width=1
,这样每一行就会有一个叶子节点,但可能会有多个键在同一行:
>>> import pprint
>>> pprint.pprint(d, width=1)
{'a': 1,
'b': 2,
'c': {'d': 3,
'e': [4,
5,
6],
'f': {'g': 7}},
'h': [8,
9,
10]}
(2) 使用 json.dumps
,这样每一行最多只有一个键,但有些行可能只会是一个闭合的括号:
>>> import json
>>> print json.dumps(d, indent=4)
{
"a": 1,
"h": [
8,
9,
10
],
"c": {
"e": [
4,
5,
6
],
"d": 3,
"f": {
"g": 7
}
},
"b": 2
}
5
pprint
是用来打印实例的表示形式,而 vars
则是直接返回实例的 __dict__
,然后打印这个表示形式。下面是一个例子:
>>> class Foo(object):
... def __init__(self, a, b):
... self.a = a
... self.b = b
... def __repr__(self):
... return 'Foo(a=%s)' % self.a
...
>>> f = Foo(a=1, b=2)
>>> vars(f)
{'a': 1, 'b': 2}
>>> pprint.pprint(f)
Foo(a=1)
>>> vars(f) is f.__dict__
True
你会看到这里的特殊方法 __repr__
(它被 pprint()
、print
语句、repr()
等调用)明确只包含了 a
这个成员,而实例的 __dict__
包含了 a
和 b
两个成员,这一点在 vars()
返回的字典中可以看到。