Я надеюсь сохранить произвольные логические логики 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?