2010-07-24 9 views
8

Estoy construyendo una DSL para la validación de formularios en Python, y uno de los requisitos es poder especificar que un campo debe ser mayor o menor que una constante u otro valor de campo. Como resultado, estoy intentando asignar fácilmente operadores como <, >, <= y >= a sus funciones equivalentes en el módulo operator, de modo que puedan invocarse durante la validación de campo.Operadores de comparación de mapas para llamar a la función

Me doy cuenta de que podría simplemente crear un diccionario para asignar el operador a la función, pero ¿hay alguna manera más agradable de hacerlo? ¿Hay alguna forma de acceder al mapeo integrado de Python?

+0

No estoy seguro de entender qué es exactamente lo que estás tratando de lograr. Python 'asigna' estos operadores a la implementación propia de la clase de los métodos de acuerdo, como '__cmp__',' __eq__', '__ne__' y así sucesivamente, y la asignación exacta a la función de comparación real depende de la clase. –

+1

Absolutamente. Entonces, en alguna parte de Python hay una lógica que sabe que cuando vea '<', debería llamar a 'obj .__ lt__'. Pero tengo una cadena, ''<'' - ¿cómo puedo convertirla en una llamada a función o método? –

+0

¿Puedes dar un ejemplo en contexto? –

Respuesta

4

Por lo que yo sé, no hay ningún diccionario integrado en el mapeo de la cadena de ">" a la función operator.lt, etc.

Como otros han señalado, el propio intérprete de Python no hace uso de tales un diccionario, ya que el proceso de analizar y ejecutar el código Python primero traducirá la secuencia de caracteres ">" a un token que representa ese operador, que luego será traducido a bytecode, y el resultado de ejecutar ese bytecode ejecutará directamente el método __lt__, en lugar de a través de la función operator.lt.

3

La asignación interna de Python de "<" a __lt__ (y así sucesivamente) no está expuesta en ninguna parte de la biblioteca estándar. Hay muchos aspectos internos de Python que no están expuestos como herramientas. Ni siquiera estoy seguro en general de cómo se crearía un mapeo. ¿Qué mapas en __getitem__?

Simplemente tendrá que crear su propia asignación. No debería ser difícil.

Cuestiones relacionadas