Estoy trabajando en algunas herramientas para un juego que estoy haciendo. Las herramientas sirven como interfaz para facilitar la edición de archivos del juego. Varios de los archivos son archivos de scripts Python. Por ejemplo, tengo un archivo Items.py que contiene lo siguiente (minimizada por ejemplo)Manipulando un archivo Python desde C#
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))
Como ya he mencionado, quiero ofrecer una interfaz para editar este archivo sin exigir a un editor para saber pitón/editar el archivo directamente. Mi editor tiene que ser capaz de:
- Buscar y enumerar todos los tipos de clase (en este ejemplo, sería solamente objeto con el Script)
- Encuentra y una lista de todos los elementos creados (en este caso hay' d solo uno, Abounding Crystal). Necesitaría encontrar el tipo (en este caseScriptedItem) y todos los valores de los parámetros
- Permitir la edición de parámetros y la creación/eliminación de elementos.
Para hacer esto, comencé a escribir mi propio analizador sintáctico, buscando la palabra clave class y cuando estas clases grabadas se usan para construir objetos. Esto funcionó para datos simples, pero cuando comencé a usar clases con constructores complejos (listas, mapas, etc.) se hizo cada vez más difícil de analizar correctamente.
Después de buscar, descubrí que IronPython facilitaba el análisis de archivos Python, así que eso es lo que hice. Una vez que construí el Árbol de sintaxis abstracta, utilicé PythonWalkers para identificar y encontrar toda la información que necesitaba. Esto funciona perfectamente para leer datos, pero no veo una manera fácil de insertar datos actualizados en el archivo de Python. Por lo que puedo decir, no hay forma de cambiar los valores en el AST y mucho menos volver a convertir el AST en un archivo de script. Si me equivoco, me encantaría que alguien me dijera cómo podría hacer esto. Lo que tendría que hacer ahora es buscar en el archivo hasta encontrar la línea correcta, luego intentar insertar los datos en el constructor, asegurando el orden correcto.
¿Hay alguna solución obvia que no estoy viendo? ¿Debería seguir trabajando en mi analizador sintáctico y hacerlo compatible con tipos de datos más complejos? Realmente pensé que lo tenía con el analizador de IronPython, pero no pensé en lo difícil que sería volver a introducir los datos modificados en el archivo.
Cualquier sugerencia sería apreciada