I have a Python script which processes a .txt file which contains report usage information. I\'d like to find a way to cleanly print the attributes of an object using pprint\'s
I think beeprint is what you need.
Just pip install beeprint
and change your code to:
def __str__(self):
from beeprint import pp
return pp(self, output=False)
pprint
is just another form of print. When you say pprint(vars(self))
it prints vars into stdout and returns none because it is a void function. So when you cast it to a string it turns None
(returned by pprint
) into a string which is then printed from the initial print statement. I would suggest changing your print to pprint
or redefine print as print if its all you use it for.
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
One alternative is to use a formatted output:
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()])
Hope this helped
Dan's solution is just wrong, and Ismail's in incomplete.
__str__()
is not called, __repr__()
is called.__repr__()
should return a string, as pformat does.Here is an example
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)
This prints
{ 'b': 'bee',
'c': { 'cats': [ 'blacky',
'tiger'],
'dogs': [ 'rex',
'king']},
'd': { 'more_c': { 'cats': [ 'blacky',
'tiger'],
'dogs': [ 'rex',
'king']}}}
Which is not perfect, but passable.
For pretty-printing objects which contain other objects, etc. pprint
is not enough. Try IPython's lib.pretty, which is based on a Ruby module.
from IPython.lib.pretty import pprint
pprint(complex_object)
pprint.pprint
doesn't return a string; it actually does the printing (by default to stdout, but you can specify an output stream). So when you write print record
, record.__str__()
gets called, which calls pprint
, which returns None
. str(None)
is 'None'
, and that gets print
ed, which is why you see None
.
You should use pprint.pformat instead. (Alternatively, you can pass a StringIO
instance to pprint
.)