Я работаю над некоторыми инструментами для игры, которую делаю.Инструменты служат интерфейсом для облегчения редактирования файлов игры.Некоторые из этих файлов являются файлами сценариев Python.Например, у меня есть файл Items.py, который содержит следующее (например, минимизировано)
from ItemModule import *
import copy
class ScriptedItem(Item):
def __init__(self, name, description, itemtypes, primarytype, flags, usability, value, throwpower):
Item.__init__(self, name, description, itemtypes, primarytype, flags, usability, value, throwpower, Item.GetNextItemID())
def Clone(self):
return copy.deepcopy(self)
ItemLibrary.AddItem(ScriptedItem("Abounding Crystal", "A colourful crystal composed of many smaller crystals. It gives off a warm glow.", ItemType.SynthesisMaterial, ItemType.SynthesisMaterial, 0, ItemUsage.Unusable, 0, 50))
Как я уже упоминал, я хочу предоставить интерфейс для редактирования этого файла без необходимости редактора, чтобы знать Python/ редактировать файл напрямую.Мой редактор должен уметь:
- Находить и перечислять все типы классов (в этом примере это будет только Scripted Item)
- Находить и перечислять все созданные элементы (в этом случае будет только один, Abounding Crystal).Мне нужно найти тип (в данном случае ScriptedItem) и все значения параметров
- Разрешить редактирование параметров и создание / удаление элементов.
Для этого яначал писать свой собственный анализатор, искал ключевое слово класса и когда эти записанные классы используются для конструирования объектов.Это работало для простых данных, но когда я начал использовать классы со сложными конструкторами (списки, карты и т. Д.), Стало все труднее правильно анализировать.
После поиска я обнаружил, что IronPython облегчает синтаксический анализ pythonфайлы, так вот что я делал.Создав абстрактное синтаксическое дерево, я использовал PythonWalkers, чтобы идентифицировать и найти всю необходимую мне информацию.Это прекрасно работает для чтения данных, но я не вижу простого способа вставить обновленные данные в файл Python.Насколько я могу судить, невозможно изменить значения в AST и тем более преобразовать AST обратно в файл сценария.Если я ошибаюсь, я бы хотел, чтобы кто-нибудь рассказал мне, как я могу это сделать.Теперь мне нужно поискать в файле, пока я не найду правильную строку, а затем попытаться вставить данные в конструктор, обеспечив правильное упорядочение.
Есть ли какое-то очевидное решение, которого я не вижу?Должен ли я просто продолжать работать со своим парсером и заставить его поддерживать более сложные типы данных?Я действительно думал, что у меня это было с парсером IronPython, но я не думал о том, насколько сложно было бы перенести измененные данные обратно в файл.
Буду признателен за любые предложения