如何使用 pprint 使用内置的 __str__(self) 方法打印对象?

新手上路,请多包涵

我有一个 Python 脚本,它处理一个包含报告使用信息的 .txt 文件。我想找到一种使用 pprint 的 pprint(vars(object)) 函数干净地打印对象属性的方法。

该脚本读取文件并创建 Report 类的实例。这是课程。

 class Report(object):
    def __init__(self, line, headers):
        self.date_added=get_column_by_header(line,headers,"Date Added")
        self.user=get_column_by_header(line,headers,"Login ID")
        self.report=get_column_by_header(line,headers,"Search/Report Description")
        self.price=get_column_by_header(line,headers,"Price")
        self.retail_price=get_column_by_header(line,headers,"Retail Price")

    def __str__(self):
        from pprint import pprint
        return str(pprint(vars(self)))

我希望能够干净地打印 Report 的实例 a-la-pprint。

 for i,line in enumerate(open(path+file_1,'r')):
    line=line.strip().split("|")
    if i==0:
        headers=line

    if i==1:
        record=Report(line,headers)
        print record

当我打电话

print record

对于 Report 的单个实例,这是我在 shell 中得到的。

 {'date_added': '1/3/2012 14:06',
'price': '0',
'report': 'some_report',
'retail_price': '0.25',
'user': 'some_username'}
 None

我的问题有两个方面。

首先,这是干净地打印对象属性的好/理想方式吗?使用或不使用 pprint 是否有更好的方法来做到这一点?

二、为什么

None

最后打印到外壳?我很困惑那是从哪里来的。

感谢您的任何提示。

原文由 hernamesbarbara 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 451
2 个回答

pprint 只是另一种打印形式。当您说 pprint(vars(self)) 时,它会将 vars 打印到 stdout 并返回 none,因为它是一个 void 函数。因此,当您将它转换为字符串时,它会变成 None (由 pprint 返回)变成一个字符串,然后从初始 print 语句打印该字符串。我建议将您的打印更改为 pprint 或将打印重新定义为打印(如果您只使用它)。

 def __str__(self):
    from pprint import pprint
    return str(vars(self))

for i,line in enumerate(open(path+file_1,'r')):
    line = line.strip().split("|")
    if i == 0:
        headers = line
    if i == 1:
        record = Report(line,headers)
        pprint record

一种替代方法是使用格式化输出:

 def __str__(self):
    return "date added:   %s\nPrice:        %s\nReport:       %s\nretail price: %s\nuser:         %s" % tuple([str(i) for i in vars(self).values()])

希望这有帮助

原文由 Dan 发布,翻译遵循 CC BY-SA 3.0 许可协议

Dan 的解决方案是错误的,而 Ismail 的解决方案不完整。

  1. __str__() 不被调用, __repr__() 被调用。
  2. __repr__() 应该像 pformat 一样返回一个字符串。
  3. 打印通常只缩进 1 个字符并尝试保存行。如果你想弄清楚结构,请将宽度设置得低,缩进高。

这是一个例子

class S:
    def __repr__(self):
        from pprint import pformat
        return pformat(vars(self), indent=4, width=1)

a = S()
a.b = 'bee'
a.c = {'cats': ['blacky', 'tiger'], 'dogs': ['rex', 'king'] }
a.d = S()
a.d.more_c = a.c

print(a)

这打印

{   'b': 'bee',
    'c': {   'cats': [   'blacky',
                         'tiger'],
             'dogs': [   'rex',
                         'king']},
    'd': {   'more_c': {   'cats': [   'blacky',
                               'tiger'],
                  'dogs': [   'rex',
                              'king']}}}

这并不完美,但还过得去。

原文由 Charles Merriam 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题