2010-07-24 18 views
8

Sto costruendo un DSL per la convalida del modulo in Python e uno dei requisiti è quello di essere in grado di specificare che un campo deve essere maggiore o minore di una costante o di un altro valore di campo. Di conseguenza, sto cercando di mappare facilmente operatori come <, >, <= e >= alle loro funzioni equivalenti nel modulo operator, in modo che possano essere chiamati durante la convalida del campo.Operatori di confronto mappe per funzionare chiamare

Mi rendo conto che potrei semplicemente creare un dizionario per mappare l'operatore alla funzione, ma c'è un modo migliore per farlo? C'è un modo per accedere alla mappatura integrata di Python?

+0

Non sono sicuro di capire esattamente cosa stai cercando di ottenere. Python "mappa" questi operatori sulla propria implementazione di metodi secondo, come '__cmp__',' __eq__', '__ne__' e così via, e il mapping esatto alla funzione di comparazione effettiva dipende dalla classe. –

+1

Assolutamente. Quindi da qualche parte in Python c'è una logica che sa che quando vede '<', dovrebbe chiamare 'obj .__ lt__'. Ma ho una stringa, ''<'' - come posso convertirla in una funzione o in una chiamata di metodo? –

+0

Puoi fornire un esempio di contesto? –

risposta

4

Per quanto io sappia, non v'è alcun dizionario integrato nella mappatura della stringa ">" alla funzione operator.lt, ecc

Come altri hanno fatto notare, l'interprete Python per sé non fa uso di tali un dizionario, dal momento che il processo di parsing ed esecuzione del codice Python tradurrà prima la sequenza di caratteri ">" in un token che rappresenta quell'operatore, che verrà quindi tradotto in bytecode, e il risultato dell'esecuzione di quel bytecode eseguirà direttamente il metodo __lt__, piuttosto che tramite la funzione operator.lt.

3

La mappatura interna di Python di "<" a __lt__ (e così via) non è esposta da nessuna parte nella libreria standard. Ci sono molte cose sugli interni di Python che non sono esposti come toolkit. Non sono nemmeno sicuro, in generale, di come sarebbe stata creata tale mappatura. Cosa mappa su __getitem__?

Devi solo creare la tua mappatura. Non dovrebbe essere difficile.

Problemi correlati