Sto lavorando su alcuni strumenti per un gioco che sto realizzando. Gli strumenti servono come front end per semplificare la modifica dei file di gioco. Molti dei file sono file di script Python. Per esempio, io ho un file Items.py che contiene la seguente (minimizzato per esempio)Manipolazione di un file Python da 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))
come ho già detto, voglio fornire un front-end per la modifica di questo file senza l'esigenza che un editor di sapere python/modificare il file direttamente. Il mio editore ha bisogno di essere in grado di:
- Trova ed elenca tutti i tipi di classe (in questo esempio, sarebbe solo Articolo Sceneggiato)
- Trova ed elenca tutti gli elementi creati (in questo caso c'e' d solo uno, Cristallo abbondante). Avrei bisogno di trovare il tipo (in questo caseScriptedItem) e tutti i valori dei parametri
- Permetti la modifica dei parametri e la creazione/rimozione di elementi.
Per fare ciò, ho iniziato a scrivere il mio parser, cercando la parola chiave class e quando queste classi registrate sono utilizzate per costruire oggetti. Questo ha funzionato per dati semplici, ma quando ho iniziato a utilizzare classi con costruttori complessi (elenchi, mappe, ecc.) È diventato sempre più difficile analizzare correttamente.
Dopo aver cercato in giro, ho trovato che IronPython ha reso facile l'analisi dei file Python, quindi è quello che ho fatto. Una volta creato l'Abstract Syntax Tree ho usato PythonWalkers per identificare e trovare tutte le informazioni di cui ho bisogno. Questo funziona perfettamente per la lettura dei dati, ma non vedo un modo semplice per inserire dati aggiornati nel file Python. Per quanto posso dire, non c'è modo di modificare i valori nell'AST e molto meno di convertire l'AST in un file di script. Se sbaglio, mi piacerebbe che qualcuno mi dicesse come potrei farlo. Quello che dovrei fare ora è cercare nel file finché non trovo la linea corretta, quindi provare a inserire i dati nel costruttore, assicurando l'ordine corretto.
C'è qualche soluzione ovvia che non vedo? Dovrei continuare a lavorare sul mio parser e farlo supportare tipi di dati più complessi? Io davvero se l'avessi con il parser IronPython, ma non pensavo a quanto sarebbe difficile spingere nuovamente i dati modificati nel file.
Tutti i suggerimenti sarebbero apprezzati