C'è un modo per generare codice bytecode Python?

abstract-syntax-tree bytecode dsl expression-trees python

Domanda

Voglio hackerare con l'interprete Python e provare a creare una piccola DSL. Esiste un modulo in cui posso fare qualcosa come questo codice teorico (simile agli alberi di espressione LINQ)?

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

O sarebbe semplicemente più semplice generare codice sorgente Python? Questo potrebbe essere reso più semplice usando C o SWIG o Cython?

Risposta accettata

Lavorare via ast e compilare l'albero in bytecode, come suggerisce un'altra risposta, è probabilmente il più semplice; generare fonti e compilarle, quasi altrettanto bene.

Tuttavia, per esplorare approcci di livello inferiore, controlla i link da questa pagina ; Ho trovato particolarmente utile il byteplay (attualmente non funziona su 2.6 o 3. *, solo 2.4 o 2.5, ma penso che risolverlo per 2.6 dovrebbe essere facile, come già discusso nel suo tracker). Non ho usato allo stesso modo di tutte le funzionalità di Phil Eby BytecodeAssembler , ma data la reputazione dell'autore sono sicuro che ne vale la pena il check it out!


Risposta popolare

In Python 2.X, in genere ci si avvicina a questo con il modulo compiler e il suo sottomodulo ast (ma si noti che questo modulo è deprecato dalla versione 2.6). In Python 3.X, useresti solo ast .

Entrambi offrono una funzione compile() che andrà dalla sorgente / AST a "un oggetto codice che può essere eseguito exec o eval() ".



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché