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

her*_*ara 12 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)))
Run Code Online (Sandbox Code Playgroud)

我希望能够干净地打印报告的实例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
Run Code Online (Sandbox Code Playgroud)

我打电话的时候

print record
Run Code Online (Sandbox Code Playgroud)

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

{'date_added': '1/3/2012 14:06',
'price': '0',
'report': 'some_report',
'retail_price': '0.25',
'user': 'some_username'}
 None
Run Code Online (Sandbox Code Playgroud)

我的问题是双重的.

首先,这是一种干净地打印对象属性的好/期望方式吗?有或没有pprint有更好的方法吗?

第二,为什么呢

None
Run Code Online (Sandbox Code Playgroud)

最后打印到shell?我很困惑那来自哪里.

谢谢你的任何提示.

Cha*_*iam 20

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

  1. __str__()没有被称为,__repr__()被称为.
  2. __repr__() 应该返回一个字符串,就像pformat一样.
  3. print通常只缩进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)
Run Code Online (Sandbox Code Playgroud)

这打印

{   'b': 'bee',
    'c': {   'cats': [   'blacky',
                         'tiger'],
             'dogs': [   'rex',
                         'king']},
    'd': {   'more_c': {   'cats': [   'blacky',
                               'tiger'],
                  'dogs': [   'rex',
                              'king']}}}
Run Code Online (Sandbox Code Playgroud)

哪个不完美,但可以通过.


Ism*_*awi 12

pprint.pprint不返回字符串; 它实际上是打印(默认情况下为stdout,但您可以指定输出流).所以当你写print record,record.__str__()被调用,哪些调用pprint,返回None. str(None)'None',并且得到了printed,这就是你看到的原因None.

你应该使用pprint.pformat.(或者,您可以将StringIO实例传递给pprint.)


小智 5

pprint只是另一种印刷形式。当您说pprint(vars(self))它将vars输出到stdout时,由于它是一个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
Run Code Online (Sandbox Code Playgroud)

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

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()])
Run Code Online (Sandbox Code Playgroud)

希望这对您有所帮助

  • 虽然您已正确诊断出故障,但是建议的解决方案都很笨拙。pprint.pformat更加优雅。 (2认同)

cdu*_*001 5

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

from IPython.lib.pretty import pprint
pprint(complex_object)
Run Code Online (Sandbox Code Playgroud)


小智 5

我认为beeprint是你所需要的。

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

def __str__(self):
    from beeprint import pp
    return pp(self, output=False)
Run Code Online (Sandbox Code Playgroud)