gpt4 book ai didi

python - pformat() 输出的缩进

转载 作者:行者123 更新时间:2023-11-28 16:33:32 25 4
gpt4 key购买 nike

我有一个使用 pformat() 的函数将字典转换为字符串(不相关:稍后将使用 write() 将字符串插入到 .py 文件中)。

所以 MY_DCT = {1: 11, 2: 22, 3: 33} 会变成这样的字符串:

MY_DCT = {
1: 11,
2: 22,
3: 33}

这个函数有两个要求:

  1. Dict 项必须显示在第一行之后。
  2. 元素必须缩进 4 个空格。

函数如下:

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}

我检查了 parameters pformat() 但我无法弄清楚如何使每行出现正确数量的空格。

我知道我可以使用 replace()+' ' 等来修复字符串,但我想知道额外的空格是从哪里来的,如果我可以通过正确设置参数来摆脱它(如果可能的话)。

注意:如果有更好的方法来实现上述目标,请告诉我。

最佳答案

pformatindent 的默认值为 1,因此键一个接一个地出现。

例如,pformat(d, indent=0, width=1) 将产生以下字符串:

{1: 11,
2: 22,
3: 33}

缩进=1:

{1: 11,
2: 22,
3: 33}

indent=2:

{ 1: 11,
2: 22,
3: 33}

总是在第一行少一个空格。


由于目标是在第一行之后显示 dict 元素,并且所有元素都缩进 4 个空格,因此在第一个元素之前添加一个空格并使用 indent=4 将适用于某些字典(正如@logic所建议的)。

但是像 d = {1: {'a': 1, 'b': 2}, 2: 22, 3: 33} 这样的命令看起来会很丑陋,因为 indent 也会影响深度大于 1 的字典的外观:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com