Как разобрать произвольные логические логики c из yaml - PullRequest
0 голосов
/ 24 марта 2020

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

RULES:
    1: 
      FILTER:
        - OR:
          - CONDITION1: XYZ        
          - CONDITION1: ABC               
    2: 
      FILTER:
        - AND:
          - CONDITION1: XYZ                  
    3: 
      FILTER:
        - AND:
          - CONDITION2: ABC
    4: 
      FILTER:
        - AND:
          - CONDITION1: ABC
          - CONDITION2: False
    5: 
      FILTER:
        - AND:
          - CONDITION1: ABC
          - CONDITION3: False

python, который я использую для реализации синтаксического анализатора правил yaml, выглядит следующим образом:

#capture user responses to dict USER_RESPONSES
#Load yaml to rule_dict

for rule_i in rule_dict['RULES']:
    print(rule_i)
    all_tests_pass = True
    for filter_i in rule_dict['RULES'][rule_i]['FILTER']:
        print(type(filter_i),filter_i)

        if 'OR' in filter_i:
            test_or_pass = False
            for filter_i_j in filter_i['OR']:
                for filter_i_j_k in filter_i_j:
                    if filter_i_j_k in USER_RESPONSES and USER_RESPONSES[filter_i_j_k] == filter_i_j[filter_i_j_k]:
                        test_or_pass = True
                        break
            if not test_or_pass:
                all_tests_pass = False
                break

        if 'AND' in filter_i:
            test_and_pass = True
            for filter_i_j in filter_i['AND']:
                for filter_i_j_k in filter_i_j:
                    if not (filter_i_j_k in USER_RESPONSES and USER_RESPONSES[filter_i_j_k] == filter_i_j[filter_i_j_k]):
                        test_and_pass = False
                        break
            if not test_and_pass:
                all_tests_pass = False
                break
    print('------------')
    if all_tests_pass:
        print("PASS Filters - This Rule Will Be Applied:")

Это должно быть быть лучшим способом сохранить логи фильтра c, которые могут быть сложными. Я спорю, просто попросив пользователя написать python в yaml. Любые мысли о наилучшем подходе для размещения произвольных пользовательских фильтров в yaml, которые будут проанализированы в python?

...