1

我正在使用 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. 有没有办法让它列出 = None 的属性?None 是一个合法值,为什么它将这些属性视为不存在?
  3. 有没有办法让 pprint 在属性之间换行?
4

3 回答 3

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()

于 2011-11-17T14:30:29.153 回答
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) 使用pprintwithwidth=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) Usingjson.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
}
于 2014-03-27T20:22:39.330 回答
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': { }}}

希望有帮助。

于 2012-06-07T22:26:00.290 回答