2013-03-05 6 views
5

Sto facendo una generazione di classi dinamiche che potrebbe essere statica determinata in fase di "compilazione". Il caso semplice che ho in questo momento sembra più o meno così:Risultati permanenti nella cache della generazione della classe Python

class Base(object): 
    def __init__(self, **kwargs): 
     self.do_something() 

def ClassFactory(*args): 
    some_pre_processing() 
    class GenericChild(Base): 
     def __init__(self, **kwargs): 
      self.some_processing() 
      super(GenericChild, self).__init__(*args, **kwargs) 
    return GenericChild 

Child1 = ClassFactory(1, 'Child_setting_value1') 
Child2 = ClassFactory(2, 'Child_setting_value2') 
Child3 = ClassFactory(3, 'Child_setting_value3') 

Durante l'importazione, l'interprete Python sembra compilare in bytecode, quindi eseguire il file (generando così Child1, Child2, e Child3) una volta al Istanza di Python

C'è un modo per dire Python per compilare il file, eseguirlo una volta per decomprimere i Child classi, quindi compilare che nel file pyc, in modo che il disimballaggio accade solo una volta (anche attraverso esecuzioni successive dello script Python)?

Ho altri casi di utilizzo che sono più complicati ed espansivi, quindi semplicemente liberare la fabbrica scrivendo manualmente le classi Child non è davvero un'opzione. Inoltre, vorrei evitare un ulteriore passo del preprocessore se possibile (come l'uso delle macro in stile C con il preprocessore C).

risposta

1

No, dovresti generare il codice Python invece dove quelle classi sono "cotte" al codice Python.

Utilizzare una qualche forma di stringa di modello in cui si genera il codice sorgente Python, salvarlo in file .py, quindi byteccompile quelli.

Tuttavia, la generazione di classe si verifica solo una volta all'avvio. È davvero un grande costo generare questi?

+0

Non costa molto per classe, ma ho un sacco di casi simili e ho bisogno di generare molte istanze python spesso, quindi si aggiunge, specialmente in caso di carico elevato (nel qual caso l'inizializzazione può richiedere il grosso del tempo per un programma a breve durata). – CSTobey

+0

+1 per l'utilizzo di un template templating durante la generazione del codice Python. – thebjorn

0

Se non è necessario separare le classi secondarie e si desidera solo una "configurazione standard" per questi insiemi particolari di oggetti, è sufficiente rendere ObjectFactory una classe con la configurazione memorizzata in tale posizione. Ogni istanza sarà in grado di sputare GenericChildren con la configurazione appropriata, ignorando completamente la generazione di classi di runtime (e il mal di debug associato ad esso).