Оцените логическую логику, используя DFS в python dict - PullRequest
0 голосов
/ 01 июня 2018

У меня есть структура dict, которая выглядит следующим образом:

{
"condition": "AND",
"rules": [
    {
        "id": "monitor_category",
        "field": "monitor_category",
        "type": "string",
        "input": "select",
        "operator": "equal",
        "value": "Competition",
        "decision": True
    },
    {
        "id": "monitor_tag",
        "field": "monitor_tag",
        "type": "string",
        "input": "text",
        "operator": "equal",
        "value": "PassiveTotal",
        "decision": True
    },
    {
        "condition": "OR",
        "rules": [
            {
                "id": "article_tag",
                "field": "article_tag",
                "type": "string",
                "input": "text",
                "operator": "contains",
                "value": "Attack",
                "decision": False
            },
            {
                "id": "article_tag",
                "field": "article_tag",
                "type": "string",
                "input": "text",
                "operator": "contains",
                "value": "Hunt",
                "decision": True
            },
            {
                "id": "article_tag",
                "field": "article_tag",
                "type": "string",
                "input": "text",
                "operator": "contains",
                "value": "Threat",
                "decision": False
            }
        ]
    },
    {
        "id": "monitor_tag",
        "field": "monitor_tag",
        "type": "string",
        "input": "text",
        "operator": "equal",
        "value": "Analysis",
        "decision": False
    }
]

}

Для каждого правила я получаю решение и присоединяю его к правилу политики.Я делаю это с помощью простой рекурсивной прогулки по диктату.В приведенном выше примере политики логическая логика соответствует следующему:

(True and True and (False or True or False) and False)

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

1 Ответ

0 голосов
/ 01 июня 2018

Создайте словарь для хранения функций, соответствующих 'conditions'

import operator, functools
operations = {'AND':operator.and_, 'OR':operator.or_, 'XOR':operator.xor}

Напишите рекурсивную функцию, которая будет повторяться, когда 'conditions' является ключом в правиле, в противном случае выполните итерациюнад правилами и накапливают 'decisions' в списке.Используйте functools.reduce, чтобы применить condition к решениям.

def f(d):
    func = operations.get(d['condition'], None)
    if func is None:
        return
    decisions = []
    for rule in d['rules']:
        if 'condition' in rule:
            decision = f(rule)
        else:
            decision = rule['decision']
        decisions.append(decision)
    return functools.reduce(func, decisions)

if func is None: return должен был стать базовым случаем, но я не уверен, что этонеобходимо - если это произойдет, то что-то напутано, и оно, вероятно, должно поднять ValueError Я думаю, что у этого есть неявный базовый случай (если есть такая вещь) - он использует цикл for rule in d['rules']: для исчерпания элементов.


Если условия ограничены 'И' и 'ИЛИ', вы можете использовать all и any.

ops = {'AND':all, 'OR':any}
def g(d):
    func = ops.get(d['condition'], None)
    if func is None:
        return
    decisions = []
    for rule in d['rules']:
        if 'condition' in rule:
            decision = f(rule)
        else:
            decision = rule['decision']
        decisions.append(decision)
    return func(decisions)
...