python在__repr__方法的单独行中返回字典

时间:2014-08-13 05:19:16

标签: python dictionary repr

我需要使用 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 个答案:

答案 0 :(得分:3)

我认为你有充分的理由不能使用pprint ......但这不应该那么难:

def __repr__(self):
    inner_lines = '\n'.join('%s:%s' % (k, v) for k, v in self.maze.items())
    return """\
{
%s
}""" % inner_lines

e.g:

>>> 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']
}

答案 1 :(得分:2)

首先,如果您认为自己无法使用pprint的唯一原因是因为您没有查看the docs并假设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)

如果您知道如何编写列表推导,您可以将其转换为单行;如果没有,要么学习,要么保持5行。