3.24 codeop -- Compilare codice Python

Il modulo codeop fornisce le utility attraverso le quali il ciclo Python leggi-valuta-stampa può venire emulato, così come viene fatto nel modulo code. Di conseguenza, probabilmente non vorrete utilizzare il modulo direttamente; se vorrete infatti includere un ciclo simile nel vostro programma, probabilmente vorrete usare il modulo code.

Due parti suddividono questo lavoro:

  1. Essere capace di predire se una riga di input completa un costrutto Python: in breve, stabilire se stampare successivamente `>> o `... '.
  2. Ricordare quali costrutti successivi sono stati inseriti dall'utente, in modo tale che il susseguente input possa venire compilato effettivamente con essi.

Il modulo codeop fornisce un metodo per per compiere ciascuna di queste azioni, ed un metodo per compierle entrambe, insieme.

Nel primo caso:

compile_command( source[, filename[, symbol]])
Cerca di compilare source, che dovrebbe essere una stringa di codice Python, e restitusce un codice oggetto se source è codice Python valido. In questo caso, l'attributo filename del codice oggetto sarà filename, che in modo predefinito è '<input>'. Restituisce None se source non è codice Python valido, ma è un prefisso di codice Python valido.

Se si verifica un problema con source, verrà sollevata un'eccezione. Viene sollevata l'eccezione SyntaxError se si presenta della sintassi Python non valida, e OverflowError oppure ValueError se è presente una costante non valida.

L'argomento symbol determina quando source viene compilata come una dichiarazione (il valore predefinito è 'single') o come espressione ('eval'). Qualsiasi altro valore provocherà il sollevamento dell'eccezione ValueError.

Avvertenza: È possibile (ma non piacevole) che il parser blocchi l'analisi con un risultato di successo prima che sia stata raggiunta la fine del sorgente; in questo caso, i simboli finali possono venire ignorati piuttosto che causare errori. Per esempio, un backslash seguito da due caratteri di fine riga può essere seguito da garbage arbitraria. Questo comportamento verrà corretto quando le API per il parser verranno migliorate.

class Compile( )
Le istanze di questa classe hanno a disposizione metodi __call__() identici negli effetti alla funzione built-in compile(), ma con la differenza che se l'istanza compila una porzione di programma contenente una dichiarazione __future__, l'istanza stessa 'ricorda' e compila tutte le successive porzioni del programma con la dichiarazione in vigore.

class CommandCompiler( )
Le istanze di questa classe hanno a disposizione metodi __call__() identici negli effetti alla funzione compile_command(), ma con la differenza che se l'istanza compila una porzione di programma contenente una dichiarazione __future__, l'istanza stessa 'ricorda' e compila tutte le successive porzioni del programma con la dichiarazione in vigore.

Una nota sulla compatibilità tra le versioni: Compile e CommandCompiler sono nuove in Python 2.2. Se volete abilitare la caratteristica future-tracking del 2.2 ma mantenere contemporaneamente la compatibilità con la 2.1 e le versioni precedenti, potete scrivere sia:

try:
    from codeop import CommandCompiler
    compile_command = CommandCompiler()
    del CommandCompiler
except ImportError:
    from codeop import compile_command

che è un cambiamento di impatto ridotto ma introduce possibili stati non voluti nel vostro programma, oppure:

try:
    from codeop import CommandCompiler
except ImportError:
    def CommandCompiler():
        from codeop import compile_command
        return compile_command

e quindi chiamare CommandCompiler ogni volta che avrete la necessità di un nuovo oggetto compilato.

Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.