Как отмечается в комментарии, строка modis[section] = this_section = {}
- это короткий способ сказать эквивалентные две строки:
this_section = {}
modis[section] = this_section
Но это может использовать больше распаковки.
Предыдущая строкаравно
section = line[1:-1]
, которое достигается, когда переменная line
является строкой, которая начинается и заканчивается квадратными скобками.Другими словами, line
содержит название раздела в вашем файле данных.Затем section = line[1:-1]
копирует все, кроме окружающих скобок, поэтому переменная section
теперь содержит название раздела.(Первый раз, когда он выполняется, получается значение 'TERRA
', например.) Эта переменная имеет неправильное имя - она должна называться section_name
, так как на самом деле это не раздел, но я буду продолжать использоватьимя.
Затем this_section = {}
создает новый пустой раздел в виде пустого словаря.Сразу после этого modis[section] = this_section
помещает этот новый пустой словарь в больший modis
словарь и связывает раздел с именем раздела.Вот как 'TERRA': {...}
попадает в словарь результатов.
Следующие несколько строк, начинающиеся с elif len(line) and line.find("=") != -1:
, затем заполняют внутренний словарь, все еще называемый this_section
.Каждая из строк в разделе в файле помещается в этот внутренний словарь по одной строке после анализа имени ключа и значения ключа из строки файла.
Так что это общий потокпрограмма.Файл данных открывается, и словарь результатов modis
создается как пустой словарь.Имя первого раздела в файле данных найдено, поэтому создается внутренний пустой словарь с правильным именем раздела.Каждая строка в этом разделе файла данных затем помещается во внутренний словарь в нужном формате.Когда новое имя раздела найдено, новый внутренний пустой словарь создается для этого нового раздела.И так далее.
Это ясно?
Ваш последний комментарий спрашивает о двух строках сразу после строки fp = open(
.Утверждение modis = {}
ясно: оно создает полный словарь, который будет пустым и будет заполнен позже.
Следующая строка this_section = modis
неуловима.По сути, он предназначен для проверки ошибок.Основной поток программы предполагает, что файл данных представляет собой последовательность разделов, причем каждый раздел начинается с имени раздела в квадратных скобках.Но что если первый раздел не имеет названия раздела?Программа устанавливает первый внутренний словарь в словарь external , поэтому любые строки элементов будут помещены непосредственно во внешний словарь.Таким образом, элементам строки нужно куда-то идти, хотя для них не существует внутреннего словаря.Если первый раздел имеет имя раздела, то эта начальная строка ничего не делает, поскольку переменная this_section
немедленно станет новым пустым внутренним словарем.Не существует ситуации, когда словарь modis
будет вставлен в саму себя.
Другой способ справиться с этим - создать начальный внутренний словарь с пустым именем, таким как пустая строка, илиNone
значение, чтобы держать любой мошеннический безымянный начальный раздел.Затем в конце программа может проверить, использовался ли этот раздел, а если нет, то просто удалить его.Но это потребовало бы больше строк кода и выглядело бы более сложным - используемое решение добавляет только одну строку кода и является простым на вид, даже если оно не простое по смыслу.