Python pprint 问题

1 投票
3 回答
4527 浏览
提问于 2025-04-17 06:30

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

这里有几个问题(抱歉有点多):

  1. 为什么我看不到对象中的所有变量?它没有显示auth_domain这个有值的变量?
  2. 有没有办法列出那些值为None的属性?None是一个合法的值,为什么它把这些属性当成不存在的呢?
  3. 有没有办法让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__ 包含了 ab 两个成员,这一点在 vars() 返回的字典中可以看到。

撰写回答