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

时间:2012-02-03 21:06:48

标签: python string pprint

我有一个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)))

我希望能够干净地打印报告实例。

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

最后打印到shell?我很困惑那里来的地方。

感谢您的任何提示。

5 个答案:

答案 0 :(得分:20)

丹的解决方案是错的,Ismail还不完整。

    未调用
  1. __str__(),调用__repr__()
  2. __repr__()应该返回一个字符串,就像pformat一样。
  3. print通常只缩进1个字符并尝试保存行。如果您想弄清楚结构,请将宽度设置为低并缩进高。
  4. 这是一个例子

    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']}}}
    

    这不是完美的,但是可以接受。

答案 1 :(得分:12)

pprint.pprint不返回字符串;它实际上是打印(默认情况下为stdout,但您可以指定输出流)。因此,当您编写print record时,会调用record.__str__(),调用pprint,返回Nonestr(None)'None',并且printNone,这就是您StringIO的原因。

您应该使用pprint.pformat代替。 (或者,您可以将pprint实例传递给{{1}}。)

答案 2 :(得分:4)

pprint只是另一种形式的印刷品。当你说pprint(vars(self))时,它会将变量打印到stdout并返回none,因为它是一个void函数。因此,当您将其转换为字符串时,它会将None(由pprint返回)转换为字符串,然后从初始打印语句打印。我建议您将打印件更改为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()])

希望这有帮助

答案 3 :(得分:3)

对于包含其他对象的漂亮打印对象等,pprint是不够的。试试IPython's lib.pretty,它基于Ruby模块。

from IPython.lib.pretty import pprint
pprint(complex_object)

答案 4 :(得分:3)

我认为beeprint就是您所需要的。

只需pip install beeprint并将您的代码更改为:

def __str__(self):
    from beeprint import pp
    return pp(self, output=False)