Диктовка может обеспечить отображение между символом и функцией. Модуль operator
обеспечивает удобный доступ к встроенным функциям, используемым в выражениях. Кроме того, вы можете защитить некоторые атрибуты от случайного изменения из-за глючного кода, сделав их доступными только для чтения. Попытка изменить их вызовет ошибку AttributeError во время выполнения. Если кому-то действительно нужен доступ для записи, он все еще доступен через префиксные переменные с подчеркиванием, но это закрытый интерфейс.
import operator
class Expression(object):
_OP_MAP = dict((x, getattr(operator, y)) for x, y in
[('*', 'mul'), ('/', 'truediv'), ('//', 'floordiv'),
('+', 'add'), ('-', 'sub')])
_OP_MAP[None] = lambda a, b: a
a = property(lambda self: self._a) #read-only interface
b = property(lambda self: self._b)
op = property(lambda self: self._op)
def __init__(self, value1=0, value2=0, operation=None):
self._a = value1 #mutable -- we're all adults
self._b = value2
self._op = self._OP_MAP[operation]
def parse_string(self, expression_string, variables):
#...
self._op = self._OP_MAP.get(operator) #defaults to None
def evaluate(self):
return self.op(self.a, self.b)
def __repr__(self):
for k, v in self._OP_MAP.items():
if self.op == v:
return '{0} {1} {2}'.format(self.a, k, self.b)