Как разобрать оператор И / ИЛИ для вычисления строки условия в Python - PullRequest
0 голосов
/ 08 октября 2018

Если у нас есть компараторы AND / OR в строке условия, такие как

A != B AND C > 100

, как мне проанализировать эту строку и оценить результат так, чтобы следующий код возвратил false

A = "foo" B = "foo" C = 99  ->  eval("A != B AND C > 100") is false

Я использую библиотеку операторов, чтобы выполнить оценку и выполнить наивную проверку, но если мы увидим AND, то нам нужно завершить оценку с обеих сторон, прежде чем использовать оператор AND.Есть ли лучший способ сделать анализ и оценку?

import operator
ops = {
    "AND": operator.and_,
    "OR": operator.or_,
    "==": operator.eq,
    "!=": operator.ne,
    "<": operator.lt,
    "<=": operator.le,
    ">": operator.gt,
    ">=": operator.ge 
}
        result = false
        content = string.split(" ")
        for content in contents:
            if content in ops:
                    a = contents[i-1]
                    b = contents[i+1]
                result = ops[content](a, b)
                contents[i+1] = result
            i+=1
        if result is True:
            print("It is true")

1 Ответ

0 голосов
/ 08 октября 2018

Я не анализирую фактические переменные в этом, но он должен быть в состоянии сделать то, что вы просите.Сначала он оценивает 0-й приоритет, затем оценивает 1-й, основываясь на 0-м и т. Д.Я только проверил это на 2 приоритета, но я считаю, что это должно работать для всех.Вот как он работает.

['A', '!=', 'A', 'AND', 'B', '==', 'B']
[False, 'AND', True]
[False]

Вот фактический код:

import operator
ops = {
    "AND": operator.and_,
    "OR": operator.or_,
    "==": operator.eq,
    "!=": operator.ne,
    "<": operator.lt,
    "<=": operator.le,
    ">": operator.gt,
    ">=": operator.ge 
}
prior = {
    "AND": 1,
    "OR": 1,
    "==": 0,
    "!=": 0,
    "<": 0,
    "<=": 0,
    ">": 0,
    ">=": 0
}
maxPrior = 1
def parseEval(string):
    content = string.split()
    for priorMode in range(maxPrior+1):
        print(content)
        subParse = []
        subParse = []
        for ind,cont in enumerate(content):
            if cont in ops:
                priorLev = prior[cont]
                if priorLev <= priorMode:
                    condA = content[ind-1]
                    condB = content[ind+1]
                    subParse.append(ops[cont](condA,condB))
                else:
                    subParse.append(cont)   
        content = subParse
    print(content)
    return subParse[0]
parseEval("A != A OR B == B")

Если вы хотите, вы можете сделать операции и до внутри функции.Также извините, мне следовало дать тем, кто обозначает приоритет, лучшее имя, так как оно звучит как другое слово.Извините, если это дало путаницу.Если у вас есть какие-либо вопросы, пожалуйста, дайте мне знать, я рад помочь!

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