Existe-t-il un moyen de générer par programmation du bytecode Python?

abstract-syntax-tree bytecode dsl expression-trees python

Question

Je veux faire le tour avec l'interprète Python et essayer de créer un petit DSL. Existe-t-il un module dans lequel je peux faire quelque chose comme ce code théorique (similaire aux arbres d'expression LINQ)?

expression_tree = Function(
    Print(
        String('Hello world!')
    )
 )
compile_to_bytecode(expression_tree)

Ou serait-il simplement plus facile de générer du code source Python? Cela pourrait-il être facilité en utilisant C, SWIG ou Cython?

Réponse acceptée

Travailler via ast et compiler l’arbre en bytecode, comme le suggère une autre réponse, est probablement plus simple; générer des sources et les compiler, presque aussi bien.

Cependant, pour explorer les approches de niveau inférieur, consultez les liens de cette page ; J'ai trouvé le jeu d' octets particulièrement utile (pour le moment, les versions 2.6 et 3. * ne fonctionnent pas, mais uniquement pour 2.4 ou 2.5, mais je pense qu'il est facile de le fixer à la version 2.6, comme indiqué dans son suivi). Je n'ai pas utilisé BytecodeAssembler de Phil Eby avec des fonctionnalités similaires, mais étant donné la réputation de l'auteur, je suis sûr que cela vaut la peine de le vérifier!


Réponse populaire

En Python 2.X, vous devriez généralement aborder cela avec le module de compiler et son sous-module ast (mais notez que ce module est obsolète depuis la version 2.6). En Python 3.X, vous utiliseriez simplement ast .

Les deux offrent une fonction compile() qui passera de source / AST à "un objet de code pouvant être exécuté par l'instruction exec ou eval() ".




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi