我正在使用Google App Engine环境中的User对象,并尝试了以下内容:
pprint(user)
print vars(user)
结果:
pprint(用户)
users.User(email='test@example.com',_user_id='18580000000000')
打印变量(用户)
{'_User__federated_identity': None, '_User__auth_domain': 'gmail.com',
'_User__email': 'test@example.com', '_User__user_id': '1858000000000',
'_User__federated_provider': None}
这里有几个问题(对于多部分感到抱歉):
auth_domain
,它有一个值?答案 0 :(得分:5)
pprint
正在打印实例的repr
,而vars
只返回实例的__dict__
,然后打印其repr。这是一个例子:
>>> 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()
返回的字典反映。
答案 1 :(得分:1)
参考问题3,“有没有办法让pprint在属性之间进行换行?”:
Python Docs进行了此说明:
如果格式化的表示可以将对象保留在单行上,如果它们不适合允许的宽度,则将它们分成多行。
属性“width”(在init中可通过)是指定允许内容的位置。我将我的设置为宽度= 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': { }}}
希望有所帮助。
答案 2 :(得分:1)
有几种方法可以在这种对象打印转储中获得不同的换行符。
示例数据:
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
一起使用可为每行提供一个叶节点,但每行可能> 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
}