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的解决方案不完整.
__str__()
没有被称为,__repr__()
被称为.__repr__()
应该返回一个字符串,就像pformat一样.这是一个例子
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'
,并且得到了print
ed,这就是你看到的原因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
是不够的。尝试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)