Python pprint问题

时间:2011-11-17 14:22:47

标签: python pprint

我正在使用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}

这里有几个问题(对于多部分感到抱歉):

  1. 为什么我没有看到我对象中的所有变量。它没有显示auth_domain,它有一个值?
  2. 有没有办法让它列出属性=无?没有是合法的价值,为什么它会把这些属性视为不存在?
  3. 有没有办法让pprint在属性之间换行?

3 个答案:

答案 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__同时包含ab,并由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)将pprintwidth=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
}