Python преобразовать строку в оператор - PullRequest
2 голосов
/ 25 февраля 2011

Возможно ли преобразовать строку в оператор в python?Я хотел бы передать условие функции

В идеале это выглядело бы так:

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

Я мог бы создать словарь, в котором ключи - это строки, а значения - функции модуля оператора.Мне бы пришлось немного изменить определение 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

Это значит, что я должен сделать этот словарь, но действительно ли это необходимо?

Ответы [ 2 ]

4 голосов
/ 25 февраля 2011

Вы можете использовать eval для динамического построения фрагмента кода Python и его выполнения, но кроме этого нет никаких реальных альтернатив.Однако основанное на словаре решение намного элегантнее и безопаснее.

Кроме того, действительно ли это плохо?Почему бы не сократить его немного ...

return operator_dict[operator_string](left_value, right_value)
2 голосов
/ 25 февраля 2011

Способ определения проблемы Я не понимаю, почему вы не можете передать operator.le в функцию вместо "> =".

Если эта строка_оператора поступает из базы данных, файла или чего-то ещеили вы передаете его в своем коде?

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

Вы просто ищете удобную стенографию?Тогда вы можете сделать что-то вроде:

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

Если реальная проблема заключается в том, что у вас есть код или бизнес-правила, поступающие из базы данных или файла данных, то, возможно, вам действительно нужно взглянуть на написание небольшого парсера, который будетсопоставьте ваши входные данные с этими объектами, и тогда вы сможете взглянуть на использование таких библиотек, как pyparsing, ply, codetalker и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...