Python — проверьте, находится ли часть элемента в наборе

#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)