Python convierte una cadena a un operador

¿Es posible convertir una cadena a un operador en Python? Me gustaría pasar una condición a una función

Idealmente se vería así:

def foo(self, attribute, operator_string, right_value): left_value = getattr(self, attribute) if left_value get_operator(operator_string) right_value: return True else: return False bar.x = 10 bar.foo('x', '>', 10) [out] False bar.foo('x', '>=', 10) [out] True 

Podría hacer un diccionario donde las claves son cadenas y los valores son funciones del módulo del operador. Tendría que cambiar un poco la definición foo:

 operator_dict = {'>', operator.lt, '>=', operator.le} def foo(self, attribute, operator_string, right_value): left_value = getattr(self, attribute) operator_func = operator_dict[operator_string] if operator_func(left_value, right_value): return True else: return False 

Esto significa que tengo que hacer este diccionario, pero ¿es realmente necesario?

Puedes usar eval para construir dinámicamente un trozo de código Python y ejecutarlo, pero aparte de eso no hay alternativas reales. Sin embargo, la solución basada en el diccionario es mucho más elegante y segura.

Aparte de eso, ¿es realmente tan malo? ¿Por qué no acortarlo un poco?

 return operator_dict[operator_string](left_value, right_value) 

La forma en que se especifica el problema no veo por qué no puede pasar operator.le a la función en lugar de “> =”.

¿Si esta cadena_operadora proviene de una base de datos o un archivo o algo, o lo está pasando en su código?

 bar.foo('x', operator.le , 10) 

¿Estás buscando tener una taquigrafía conveniente? Entonces podrías hacer algo como:

 from operator import le bar.foo('x', le, 10) 

Si el verdadero problema aquí es que tiene un código o reglas de negocios provenientes de una base de datos o un archivo de datos, entonces tal vez necesite ver un pequeño analizador que asigne su entrada a estos objetos y luego podría echar un vistazo utilizando un biblioteca como pyparsing, ply, codetalker, etc.