#python
#python
Вопрос:
У меня есть набор с этим выводом:
set( [Rule(chain='OUTPUT', num='3', pkts='0', bytes='0', target='ACCEPT', prot='tcp', opt='--', inp='*', out='*', source='0.0.0.0/0', destination='10.10.7.84', extra='tcp spt:7390'),
Rule(chain='INPUT', num='1', pkts='0', bytes='0', target='ACCEPT', prot='tcp', opt='--', inp='*', out='*', source='148.100.0.0/16', destination='0.0.0.0/0', extra='tcp dpt:7390'),
Rule(chain='INPUT', num='3', pkts='0', bytes='0', target='ACCEPT', prot='tcp', opt='--', inp='*', out='*', source='10.10.7.84', destination='0.0.0.0/0', extra='tcp dpt:7390')])
Я хочу проверить, соответствует ли элемент элементу в этом наборе, но не учитывает
num='', pkts='', bytes=''
Возможно ли это?
Комментарии:
1. Это во многом зависит от
Rule
класса и от того, как он__hash__
и__eq__
методы реализованы. ЕслиRule.__hash__
иRule.__eq__
не игнорировать поляnum
,pkts
иbytes
, вам придется перебирать всеRule
экземпляры в наборе, пока не найдете подходящий.2.
Rule(x,y,z) in set(Rule(x,y,z))
Не работает?
Ответ №1:
Непроверенный код, но это один из способов сделать это. Если это правило должно распространяться на любой вид проверки на равенство, я советую модифицировать магический __eq__(self, other)
метод Rule
класса с rules_match
помощью логики.
def rules_match(rule1, rule2):
attributes_to_check = ['chain', 'target', 'prot', 'opt', ...]
return all(getattr(rule1, attribute) == getattr(rule2, attribute) for attribute in attributes_to_check)
def rule_in_set(rule, rule_set):
return any(rules_match(rule, i) for i in rule_set)
Комментарии:
1. Есть ли способ вернуть true или false в rule_in_set, который не требует изменения метода?
2. @mariahm24 Не уверен, что ты имеешь в виду. Какой метод изменить?
3. Извините, только начал изучать python на этой неделе, не очень хорошо знаком с ним. Если я установлю any(rules_match(rule, i) для i в rule_set) в переменную и проверю, является ли переменная пустой и возвращает false, иначе вернет true, будет ли это работать?
4.
any
возвращает логическое значениеTrue
илиFalse
. Итак, да, вы можете установить переменную, используя ее, т.е.rule_is_in_set = any(rules_match(rule, i) for i in rule_set)