首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python pprint问题

Python pprint问题
EN

Stack Overflow用户
提问于 2011-11-17 14:22:46
回答 3查看 4.2K关注 0票数 1

我正在使用Google环境中的用户对象,并尝试了以下操作:

代码语言:javascript
复制
pprint(user)
print vars(user)

结果:

pprint(用户)

代码语言:javascript
复制
users.User(email='test@example.com',_user_id='18580000000000')

打印vars(用户)

代码语言:javascript
复制
{'_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的属性?没有一个是合法的价值,为什么它对待这些属性就像它们不存在?
  3. 有没有一种方法可以让pprint在属性之间换行呢?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-17 14:30:29

pprint正在打印实例的repr,而vars只是返回实例的__dict__,然后打印它的__dict__。下面是一个例子:

代码语言:javascript
复制
>>> 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()返回的字典反映出来。

票数 5
EN

Stack Overflow用户

发布于 2014-03-27 20:22:39

在这类对象打印转储中,有几种方法可以获得不同的换行符。

样本数据:

代码语言:javascript
复制
d = dict(a=1, b=2, c=dict(d=3, e=[4, 5, 6], f=dict(g=7)), h=[8,9,10])

没有友好间隔的标准打印:

代码语言:javascript
复制
>>> print d
{'a': 1, 'h': [8, 9, 10], 'c': {'e': [4, 5, 6], 'd': 3, 'f': {'g': 7}}, 'b': 2}

有两种可能的解决办法:

(1)将pprintwidth=1结合使用时,每行为您提供一个叶节点,但每行可能>1个键:

代码语言:javascript
复制
>>> 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时,每行最多有一个键,但有些行只有一个结束括号:

代码语言:javascript
复制
>>> 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
}
票数 3
EN

Stack Overflow用户

发布于 2012-06-07 22:26:00

关于问题3,“是否有办法使pprint在属性之间中断行?”:

Python文档对此进行了描述:

如果可能的话,格式化表示将对象保持在一行上,如果对象不符合允许的宽度,则将其拆分为多行。

属性“宽度”(在init中可通过)是您指定允许的内容的地方。我将我的设置设置为width=1,这似乎起了作用。

例如:

代码语言:javascript
复制
pretty = pprint.PrettyPrinter(indent=2)

结果..。

代码语言:javascript
复制
{ 'acbdf': { 'abdf': { 'c': { }}, 'cbdf': { 'bdf': { 'c': { }}, 'cbd': { }}},
  'cef': { 'abd': { }}}

鉴于

代码语言:javascript
复制
pretty = pprint.PrettyPrinter(indent=2,width=1)

结果..。

代码语言:javascript
复制
{ 'acbdf': { 'abdf': { 'c': { }},
             'cbdf': { 'bdf': { 'c': { }},
                       'cbd': { }}},
  'cef': { 'abd': { }}}

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8168654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档