2015-04-01 3 views
3

У меня есть функция, которая использует pformat() преобразовать словарь в строку (значение: строка будет позже вставлена ​​write() в .py файле).Отступа pformat() выход

Так MY_DCT = {1: 11, 2: 22, 3: 33} станет строка, как это:

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

Есть требования 2 для функции:

  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(), +' ' и т.д., чтобы исправить строку, но им интересно, где это дополнительные пробелы пришли и если я могу избавиться от него, установив правильно параметры (если это вообще возможно, то есть).

Примечание: Если есть лучший способ достичь вышеуказанного, дайте мне знать.

ответ

0

Значение по умолчанию 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} 

Один меньше пробелов всегда на первой линии.


Поскольку цель состояла в том, чтобы отобразить ДИКТ элементов после первой линии, и имеет все элементы с отступом от 4 пробелов, добавлением одного пробелов перед первым элементом и с помощью indent=4 будет работать для некоторой dicts (как это было предложено @ логика).

Однако dicts как d = {1: {'a': 1, 'b': 2}, 2: 22, 3: 33} будет выглядеть весьма некрасиво, так как indent будет влиять на внешний вид dicts с глубиной больше 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} 
1

Параметры не являются проблемой при печати. Проблема возникает, когда вы добавляете новые строки ('\n'). Как вы можете видеть из этого примера:

import pprint  

def f(obj_name, obj_body_as_dct): 

    body = '{' + pprint.pformat(obj_body_as_dct, indent=4, width=1, depth=1)[1:] 
    name_and_equal_sign = obj_name + ' = ' + '\n' 

    return '"""' + name_and_equal_sign + body + '"""' + '\n\n' 


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

print(f('MY_DCT', d)) 

Это выводит:

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

символ новой строки, и добавление «{» в первой строке печати почему только первая строка вашего выход, кажется, компенсируется небольшим пространством.

ОБНОВЛЕНИЕ # 1:

После немного мастерить с этими значениями, я был в состоянии соответствовать свой желаемый результат:

import pprint  

def f(obj_name, obj_body_as_dct): 

    body = pprint.pformat(obj_body_as_dct, indent=4, width=1, depth=1)[1:] 
    name_and_equal_sign = obj_name 

    return '"""' + name_and_equal_sign + ' = ' + '{' + '\n ' + body +'"""' + '\n\n' 
                 #^I added a space in this newline 

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

print(f('MY_DCT', d)) 

Приведенный выше код выводит:

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

Итак, по сути, вам просто нужно было одно место в символе новой строки (показано в коде).

UPDATE # 2:

После вашего предложения в комментариях:

Попробуйте это: print(pp.pformat({1:11, 2:22, 3:33}, indent=0, width=1)), с отступом, идущей от 0 до 2. Вы заметите, что применяется один меньше пробел на первой строке. Это путь pformat() построен. - @ пользователь 5061

Я попытался это:

import pprint as pp 

for i in range(0,3): 
    print(pp.pformat({1:11, 2:22, 3:33}, indent=i, width=1)) 

И он дал мне этот выход:

{1: 11,  #Indent = 0 Each entry (except 1) is indented by 0 spaces, because the "{" operator is in the way. 
2: 22, 
3: 33} 
{1: 11,  #Indent = 1 Each entry is indented by 1 spaces 
2: 22, 
3: 33} 
{ 1: 11, #Indent = 2 Each entry is indented by 2 spaces 
    2: 22, 
    3: 33} 

Как вы можете видеть, эта проблема все еще с этим: "{"
Если бы этого не было, тогда отступы были бы повсюду. Для настройки этого символа была закодирована функция pformat().

+0

Попробуйте это: 'печать (pp.pformat ({1:11, 2:22, 3:33}, отступа = 0, ширина = 1)) ', с' indent', идущим от 0 до 2. Вы заметите, он применяет еще одно пробел в первой строке. Это способ «pformat()». –

+0

@ user5061 Вы пытались использовать мой код Python? Я смог исправить вашу проблему просто пробелом. – logic

0

Logic's answer Вы объяснили, почему у вас проблема с отступом. Поскольку (IMO) более краткий подход, однако, вы можете использовать json. Этот вывод предполагает, что с помощью элементов вы имеете в виду словарные элементы:

import json 
obj_name = 'MY_DCT = ' 
obj_body_as_dct = {1: 11, 2: 22, 3: 33} 

stringy = "\"\"\"" + obj_name + "{" \ 
      + str(json.dumps(obj_body_as_dct, indent=4, separators=(',', ': ')))[1:] + "\"\"\"" 
print(stringy) 

Выходы:

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

Строка будет вставлена ​​в файл '.py'. Этот вывод будет недопустимым синтаксисом. –

+0

@ user5061 Ваш желаемый результат * точно *, как показано на первом дисплее? Я могу отредактировать, если так, и поместить в строку. – miradulo

+0

Ваш результат не такой, как тот, который у меня есть в моем вопросе. Если вы скопируете этот вывод и вставьте его в файл py, вы получите синтаксическую ошибку. –

 Смежные вопросы

  • Нет связанных вопросов^_^