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

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

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

该函数有2个要求:
  • Dict 项必须显示在第一行之后。
  • 元素必须缩进 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}
    

    我检查了 pformat()parameters 但我不知道如何使每行出现正确数量的空格。

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

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

    最佳答案

    indentpformat 的默认值为 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/

    10-12 16:37