Ho un sistema che memorizza comunemente i tipi di classi decapitati.Sottoclasse sottoclasse con parametri dinamici
Voglio essere in grado di salvare le classi con parametri dinamici allo stesso modo, ma non posso perché ottengo un PicklingError nel tentativo di decollare una classe che non è globalmente trovata (non definita nel codice semplice).
Il mio problema può essere modellato come il seguente codice di esempio:
class Base(object):
def m(self):
return self.__class__.PARAM
def make_parameterized(param_value):
class AutoSubClass(Base):
PARAM = param_value
return AutoSubClass
cls = make_parameterized(input("param value?"))
Quando provo fare la serializzazione di classe, ottengo il seguente errore:
# pickle.PicklingError: Can't pickle <class '__main__.AutoSubClass'>: it's not found as __main__.AutoSubClass
import pickle
print pickle.dumps(cls)
Sto cercando un metodo per dichiarare Base come ParameterizableBaseClass
che dovrebbe definire i parametri necessari (PARAM
nell'esempio sopra). Una sottoclasse parametrica dinamica (cls
precedente) dovrebbe quindi essere selezionabile salvando il tipo "ParameterizableBaseClass" ei diversi valori param (dinamico param_value
sopra).
Sono sicuro che in molti casi questo può essere evitato del tutto ... E posso evitarlo anche nel mio codice se davvero (davvero) devo. Stavo giocando con __metaclass__
, copyreg
e anche __builtin__.issubclass
ad un certo punto (non chiedere), ma non è stato in grado di rompere questo.
Mi sento come se non dovessi essere fedele allo spirito pitone se non dovessi chiedere: come si può raggiungere questo, in modo relativamente pulito?
In modo relativamente pulito? Non penso che sia possibile per qualsiasi definizione ragionevole di "pulito". Perché stai provando a decapitare oggetti le cui classi sono generate in fase di esecuzione? Qual è il vero caso d'uso? Come hai intenzione di disimpegnare qualcosa la cui classe non esiste? –
Anche io non capisco il caso d'uso per questo. Perché non puoi semplicemente restituire un'istanza della classe con quel parametro come attributo dopo l'inizializzazione. Un altro commento, dovresti anche evitare la magia di python, ad esempio self .__ class __. PARAM'. Penso che ti stia complicando troppo. – milkypostman
Può essere il caso che questa sia una complicazione eccessiva (nel qual caso la domanda potrebbe ancora rimanere, anche senza riguardo al mio caso). Il mio esempio probabilmente sembra davvero stupido - è solo un esempio. Il mio sistema reale sottaceta i tipi di classe insieme ai parametri di creazione e li passa tra i processi in uno scenario di elaborazione parallela. Oltre a ~ 20 classi diverse in uso, con codice specifico in ognuna di esse, ho alcune classi 'basta scegliere il parametro'. Voglio essere in grado di suddividerle in modo dinamico, senza bisogno di cambiare (e potenzialmente ricaricare) il codice e renderle selezionabili. HTH. – Yonatan