在__repr__方法中python以独立行返回字典
我想用repr方法返回我在类中生成的字典,并且希望它能分行显示。
有没有什么办法可以做到这一点呢?
def __repr__:
return str(self.maze)
期望的结果:
{
(0, 0):[(0, 1), (1, 0)]
(0, 1):[(0, 0), (1, 1)]
(1, 0):[(0, 0), (1, 1)]
(1, 1):[(0, 1), (1, 0)]
}
我得到的结果:
{(0, 1): [(0, 0), (1, 1)], (1, 0): [(0, 0), (1, 1)], (0, 0): [(0, 1), (1, 0)], (1, 1): [(0, 1), (1, 0)]}
因为我不能使用“pprint”,所以我不知道还有没有其他方法可以做到。
2 个回答
2
首先,如果你觉得不能使用 pprint
的唯一原因是因为你没有查看过 文档,并且认为 pprint.pprint
是这个模块里唯一的东西——其实不是这样的。即使它真的是唯一的,你也可以创建一个 StringIO
,然后把它作为 stream
参数传进去。
不过,如果你想手动实现这个功能,当然可以。你只需要理清规则,然后把这些规则用 Python 语言表达出来。
我们来写个长一点的版本:
def __repr__(self):
lines = ['{']
for key, value in self.maze.items():
lines.append('{}:{}'.format(key, value))
lines.append(['}'])
return '\n'.join(lines)
如果你知道怎么写列表推导式,可能可以把它简化成一行代码;如果不知道,那就去学一下,或者就保持它是五行代码吧。
3
我猜你有很好的理由不能使用 pprint
... 但这其实不应该那么难:
def __repr__(self):
inner_lines = '\n'.join('%s:%s' % (k, v) for k, v in self.maze.items())
return """\
{
%s
}""" % inner_lines
比如:
>>> def fmt_dct(d):
... inner_lines = '\n'.join('%s:%s' % (k, v) for k, v in d.items())
... return """\
... {
... %s
... }""" % inner_lines
...
>>> print fmt_dct(d)
{
(0, 1):['abcdefg']
(0, 2):['foo', 'bar']
}