Python - Использование строк в качестве оператора условия в операторах If - PullRequest
0 голосов
/ 25 августа 2018

В Python возможно ли использовать строку в качестве оператора в условии оператора if?

Я хотел бы иметь объект с двумя значениями и оператор для их проверки.Например:

class Condition:
    def __init__(self, value1, operator, value2):
        self.value1 = value1
        self.operator = operator
        self.value2 = value2

    def test(self):
        if self.value1 self.operator self.value2: <- THIS IS NOT CORRECT.
            return True
        else:
            return False

condition = Condition(5, ">", 4)
if condition.test() == True:
    print("passed")
else:
    print("failed")

Спасибо.

Ответы [ 3 ]

0 голосов
/ 25 августа 2018

Модуль оператора Python предоставляет функции, соответствующие всем встроенным операторам, поэтому вы можете написать:

import operator

class Condition:
    def __init__(self, value1, op, value2):
        self.value1 = value1
        self.op = op
        self.value2 = value2
    def test(self):
        return self.op(self.value1, self.value2)

condition = Condition(5, operator.gt, 4)

if condition.test():
    print("passed")
else:
    print("failed")

Если вы хотите передать строки вместо функций, вы можете использовать dict для их отображения:

import operator

OPERATOR_SYMBOLS = {
    '<': operator.lt,
    '<=': operator.le,
    '==': operator.eq,
    '!=': operator.ne,
    '>': operator.gt,
    '>=': operator.ge
}

class Condition:
    def __init__(self, value1, op, value2):
        self.value1 = value1
        self.op = op
        self.value2 = value2
    def test(self):
        return OPERATOR_SYMBOLS[self.op](self.value1, self.value2)

condition = Condition(5, '>', 4)

if condition.test():
    print("passed")
else:
    print("failed")
0 голосов
/ 25 августа 2018

Модуль operator предоставляет различные компараторы в виде функций, поэтому вы можете отобразить из строковой формы функцию для выполнения сравнения:

import operator

class Condition:

    cmp_to_op = {'==': operator.eq,
                  '!=': operator.ne,
                  '<': `operator.lt,
                  '<=': `operator.le,
                  '>': `operator.gt,
                  '>=': `operator.ge}

    def __init__(self, value1, operator, value2):
        self.value1 = value1
        self.operator = self.cmp_to_op(operator)
        self.value2 = value2

    def test(self):
        # No need for if return True else return False; comparison already returns
        # True or False for normal objects
        return self.operator(self.value1, self.value2)
0 голосов
/ 25 августа 2018

Вы можете использовать eval('{}{}{}'.format(v1,op,v2))

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