Système de script souple avec eval()
Bonsoir,
J'aimerai réaliser et utiliser un système de scripts qui aurait le comportement suivant :
Charger dans un dict tout les fichiers contenus dans un dossier contenant chacun une réimplémentation d'une classe.
Je ne sais pas si cela veut dire quelque-chose ou pas, mais je pense que des exemples seront beaucoup plus parlants à vous comme à moi :
Voici la classe abstraite AbstractBlock qui comporte peut d’éléments (c'est juste pour l'exemple) :
Code:
1 2 3 4 5 6
| class AbstractBlock:
def __init__(self):
pass
def onCross(self, vehicle):
pass |
Et voici par exemple un fichier "grass_radioactive.block" :
Code:
1 2 3 4 5 6
| class GrassRadioactiveBlock(AbstractBlock):
def __init__(self):
pass
def onCross(self, vehicle):
vehicle.damage(10) |
Comme vous pouvez le constater, le fichier "grass_radioactive.block" ne comporte pas d'include vers la classe AbstractBlock, car en effet je veux que ce soit un fichier de script et donc qu'il se limite au minimum et que les import se fassent en interne, pas dans le script. Je pourrais toujours rajouter le "import" dans la chaine de caractère avant de la passer à eval().
De plus, une fois tout les fichiers chargés, je voudrais avoir un dict contenant pour clé le nom du fichier (sans l'extension) et comme valeur la classe contenue dedans, par exemple ici mon dict peut être représenté comme ceci :
Code:
blocks = {"radioactive_grass": RadioactiveGrassBlock}
Je ne sais pas si cette méthode est trop dure à implémenter (à priori non à l'aide de eval()) ni si elle est "sâle" ou pas, mais je tiens absolument à séparer les fichiers de script du "moteur" du jeu.
Auriez vous déjà des idées pour charger ces classes dans le dict ? Car je ne vois pas comment faire avec eval()...
Merci d'avance pour vos éventuelles remarques et réponses :)