-
Notifications
You must be signed in to change notification settings - Fork 0
Использование
Note: English version
Главная цель этой библиотеки — полный разбор файлов миссий.
Содержание:
Наиболее частый случай использования библиотеки заключается в том, чтобы указать путь к миссии и получить на выходе разобранный результат:
>>> from il2fb.parsers.mission import MissionParser
>>> parser = MissionParser()
>>> mission = parser.parse("path/to/your/mission.mis")
После этого mission
будет содержать большой словарь с результатом.
Вот и все. Вам не нужно больше ничего делать.
Функция parse_mission
может принимать не только путь к файлу, но и любой
объект, который можно использовать в качестве источника последовательности
строк: текстовый файл, список, генератор и т.д. Например:
>>> with open("path/to/your/mission.mis") as f:
... mission = parser.parse(f)
Или:
>>> lines = [
... "[Wing]",
... " r0100",
... "[r0100]",
... " Planes 1",
... " Skill 1",
... " Class air.A_20C",
... " Fuel 100",
... " weapons default",
... ]
>>> mission = parser.parse(lines)
Поскольку результирующий словарь может быть довольно большим и может иметь достаточно сложную структуру, рекомендуется использовать библиотеку t_dict, aadict или SuperDict для упрощения доступа к элементам словаря.
Вы можете сразу переходить к описанию формата результата или продолжить чтение этой главы.
Давайте поговорим о том, что происходит выше. Эта библиотека предоставляет
Python модуль il2fb.parsers.mission.sections
, который содержит парсеры для
каждой секции в файле миссии. (см. Разбор секций).
il2fb.parsers.mission.parsers.MissionParser
, как швейцарский нож,
объединяет работу всех остальных парсеров в одно целое, разбирая весь файл
миссии сразу и предоставляет необходимый результат в один момент.
Так же вы можете использовать любой другой парсер по отдельности для своих целей (см. секцию ниже).
Каждый парсер, перечисленный в главе Разбор секций (за исключением
MissionParser
) наследуется от абстрактного класса
il2fb.parsers.mission.sections.SectionParser
. Поэтому каждый из них
использует общий подход к обработке секций.
Примечание: Поскольку эти парсеры созданы для того, чтобы их использовал
MissionParser
, который является однопроходным парсером, то они могут
обрабатывать строки только поочереди. То, что Вы можете использовать эти
парсеры для своих целей, — это всего лишь побочный эффект проектирования.
Если Вам действительно необходимо разобрать некую секцию, то необходимо сначала подготовить последовательность строк и сообщить парсеру имя секции. Например:
>>> lines = [
... "MAP Moscow/sload.ini",
... "TIME 11.75",
... "TIMECONSTANT 1",
... "WEAPONSCONSTANT 1",
... "CloudType 1",
... "CloudHeight 1500.0",
... "player fiLLv24fi00",
... "army 1",
... "playerNum 0",
... ]
>>> from il2fb.parsers.mission.sections.main import MainSectionParser
>>> p = MainSectionParser()
>>> p.start('MAIN')
True
>>> for line in lines:
... p.parse_line(line)
...
>>> p.stop()
{
'location_loader': 'Moscow/sload.ini',
'time': {
'is_fixed': True,
'value': datetime.time(11, 45),
},
'cloud_base': 1500,
'weather_conditions': <constant 'Conditions.good'>,
'player': {
'aircraft_index': 0,
'belligerent': <constant 'Belligerents.red'>,
'fixed_weapons': True,
'flight_id': 'fiLLv24fi00',
},
}
Как видите, Вам необходимо импортировать нужный парсер и создать его экземпляр.
Затем Вам необходимо запустить парсер с помощью метода start
, указав
имя секции, которая будет обрабатываться. Метод вернет True
, если парсер
может обрабатывать секции с указанным именем. В противном случае метод вернет
False
.
Примечание: Названия секций могут иметь префиксы или суффиксы, например0_*
или*_0
, которые могут иметь динамическую составляющую. Так же они могут содержать в себе часть результата разбора. Поэтому невозможно четко сопоставить названия секций их парсерам. Именно поэтому каждый парсер проверяет, может ли он обработать секцию с определенным именем или нет.
Теперь пришло время скормить парсеру немного данных. Как было упомянуто ранее,
парсеры секций могут считывать только одну строку за раз с помощью метода
parse_line
. Это можно делать любым удобным способом.
После того, как все строки были переданы парсеру, необходимо остановить его,
вызвав метод stop
. Этот метод вернет окончательный результат разбора,
который обычно является словарем.