Skip to content

Использование

Alexander Oblovatniy edited this page Jan 5, 2016 · 13 revisions
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. Этот метод вернет окончательный результат разбора, который обычно является словарем.