LINUX.ORG.RU

Форматирование Python-кода со страшными вложенными словарями и списками

 ,


0

2

Достался мне питоний код, в котором определено немалое число словарей и списков. В том числе - вложенных. Например - таких (этот самый простой):

{"bla": {"bla_bla": 100,
                        "bla_bla": "bla"},
           "bla": {"bla_bla": 60},
           "bla_bla": {"limit": 32},
           "bla_saver": {"bla_bla":
                           [os.path.join(root.common.bla_dir,
                                         "tmp %s/bla" % root.bla),
                            os.path.join(root.common.bla_dir,
                                         "tmp %s/bla" % root.bla),
                            os.path.join(root.common.cache_dir,
                                         "tmp %s/bla" % root.bla)]},
           "lines": {"bla_bla": 0.01,
                     "bla_bla": 0.0,
                     "layers":
                     [{"type": "bla_bla", "bla_bla": 32,
                       "bla": 13, "bla": 13,
                       "bla_bla": "bla",
                       "bla_bla": 0.0001,
                       "bla_bla": 0.0,
                       "bla_bla_bla": 0.0},
                      {"bla": "bla_bla",
                       "bla": 5, "bla": 5, "bla": (2, 2)},
                      {"type": "bla_bla",
                       "bla": 5, "bla": 5, "bla": (2, 2)},
                    {"bla": "bla",
                     "bla": 0.00005, "bla": 0.75, "bla": 2, "bla": 5},
                     {"type": "bla", "bla_bla": 6,
                       "bla_bla": 0.9,

                       "bla_bla_bla": 0}],
                     "bla_bla_bla_bla": {"bla": bla,
                                            "bla": bla}}}

Нет ли способов красиво отформатировать такой код, с тем, чтобы чем глубже засунут очередной словарь, тем больше для него был отступ? И чтобы каждый ключик был с новой строки?

P.S. PrettyPrint едва ли поможет: форматировать надо сам код, а не выводимые им данные. Да и многие элементы словарей - подгружаются через какие-то функции.

P.P.S. Нет, я не могу задать словари где-нибудь вовне. Да, мне нужно задавать их прямо в Python-коде.


d = {'s': [], 'p': [], 'a': [], 'm': []}
l = ['s', 'p', 'a', 'm']

def lookup_dict(d):
return 's' in d

kto_tama ★★★★★
()
{
    "bla":
        {
        "bla_bla": 100,
        "bla_bla": "bla",
        },
    "bla":
        {
        "bla_bla": 60,
        },
    "bla_bla":
        {
        "limit": 32,
        },
   "bla_saver":
        {
        "bla_bla":
            [
            os.path.join(root.common.bla_dir, "tmp %s/bla" % root.bla),
            os.path.join(root.common.bla_dir, "tmp %s/bla" % root.bla),
            os.path.join(root.common.cache_dir,  "tmp %s/bla" % root.bla),
            ],
        },
    "lines":
        {
        "bla_bla": 0.01,
        "bla_bla": 0.0,
        "layers":
            [
                {
                "type": "bla_bla",
                "bla_bla": 32,
                "bla": 13,
                "bla": 13,
                "bla_bla": "bla",
                "bla_bla": 0.0001,
                "bla_bla": 0.0,
                "bla_bla_bla": 0.0,
                },
                {
                "bla": "bla_bla",
                "bla": 5,
                "bla": 5,
                "bla": (2, 2),
                },
                {
                "type": "bla_bla",
                "bla": 5,
                "bla": 5,
                "bla": (2, 2),
                },
                {
                "bla": "bla",
                "bla": 0.00005,
                "bla": 0.75, 
                "bla": 2, 
                "bla": 5,
                },
                {
                "type": "bla",
                "bla_bla": 6,
                "bla_bla": 0.9,
                "bla_bla_bla": 0,
                },
            ],
        "bla_bla_bla_bla":
            {
            "bla": "bla",
            "bla": "bla",
            },
        },
}

И не забывать ставить запятую после последнего элемента как списков, так и словарей (на случай, если потом придется добавлять элементы в конец, ищи потом, где запятую пропустил).

Virtuos86 ★★★★★
()
Последнее исправление: Virtuos86 (всего исправлений: 1)
Ответ на: комментарий от Yak

Ручками. Но, вооружившись регулярным выражением, описывающим словарь как синтаксическую форму (например, выдрать из стандартного модуля tokenize) можно написать кастомный pretty-formatter, чтобы автоматически обрабатывать пайтоновские модули скопом. Не было бы мне некогда, и будь я с регэкспами на короткой ноге, я бы показал пример, но ограничусь пожеланием удачи. Задача довольно простая.

UPD: Ну, может быть, и не такая простая, учитывая, что значениями может быть что угодно. Наверное, регулярок будет больше одной :-).

Virtuos86 ★★★★★
()
Последнее исправление: Virtuos86 (всего исправлений: 2)

Перепиши всё на Go.

anonymous
()
Ответ на: комментарий от anonymous

Мы, собственно, поэтому здесь вопросы и задаём, что гуглом пользоваться не умеем. Иначе, зачем был бы лор, кроме как понацполить?

yvv ★★☆
()
19 ноября 2014 г.

любой JSON - aligment, как плагинов к редакторам, так и онлайн инструментов тонны

Dred ★★★★★
()

Jetbrains PyCharm, reformat code.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.