我有一个使用 pformat()
将字典转换为字符串的函数(无关紧要:稍后将使用 write()
将字符串插入到 .py
文件中)。
所以 MY_DCT = {1: 11, 2: 22, 3: 33}
会变成这样的字符串:
MY_DCT = {
1: 11,
2: 22,
3: 33}
该函数有2个要求:
这是函数:
import pprint
def f(obj_name, obj_body_as_dct):
body = '{\n' + pprint.pformat(obj_body_as_dct, indent=4, width=1)[1:]
name_and_equal_sign = obj_name + ' = '
return name_and_equal_sign + body + '\n\n'
d = {1: 11, 2: 22, 3: 33}
print(f('MY_DCT', d))
如果
indent=0
我得到这个字符串:MY_DCT = {
1: 11,
2: 22,
3: 33}
如果
indent=4
我得到这个字符串:MY_DCT = {
1: 11,
2: 22,
3: 33}
我检查了
pformat()
的 parameters 但我不知道如何使每行出现正确数量的空格。我知道我可以使用
replace()
、 +' '
等来修复字符串,但我想知道多余的空格从哪里来,我是否可以通过正确设置参数来摆脱它(如果可能的话)。注意:如果有更好的方法来实现上述目标,请告诉我。
最佳答案
indent
中 pformat
的默认值为 1,因此键出现在另一个下方。
例如, pformat(d, indent=0, width=1)
将产生以下字符串:
{1: 11,
2: 22,
3: 33}
indent=1
:{1: 11,
2: 22,
3: 33}
和
indent=2
:{ 1: 11,
2: 22,
3: 33}
第一行总是少一个空格。
由于目标是在第一行之后显示 dict 元素,并且所有元素都缩进 4 个空格,因此在第一个元素之前添加一个空格并使用
indent=4
将适用于某些 dicts(如@logic 所建议的)。然而,像
d = {1: {'a': 1, 'b': 2}, 2: 22, 3: 33}
这样的 dicts 看起来相当难看,因为 indent
也会影响深度大于 1 的 dicts 的外观:MY_DCT = {
1: { 'a': 1,
'b': 2},
# ^
# |
# ugly
2: 22,
3: 33}
最吸引人的解决方案(对于我正在处理的数据)是保留
indent=1
并为第一个元素添加 3 个空格,为其余元素添加 4 个空格。def f(obj_name, given_dct):
"""
Converts given dct (body) to a pretty formatted string.
Resulting string used for file writing.
Args:
obj_name: (str) name of the dict
Returns:
(str)
"""
string = pp.pformat(given_dct, width=1)[1:]
new_str = ''
for num, line in enumerate(string.split('\n')):
if num == 0:
# (pprint module always inserts one less whitespace for first line)
# (indent=1 is default, giving everything one extra whitespace)
new_str += ' '*4 + line + '\n'
else:
new_str += ' '*3 + line + '\n'
return obj_name + ' = {\n' + new_str
s = f(obj_name='MY_DCT', given_dct=d)
导致此字符串:
MY_DCT = {
1: {'a': 'aa',
'b': [1,
2,
3]},
2: 22,
3: 33}
关于python - pformat() 输出的缩进,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29397777/