在__repr__方法中python以独立行返回字典

1 投票
2 回答
6604 浏览
提问于 2025-04-18 17:06

我想用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']
}

撰写回答