2016-09-29 2 views
1

であるかどうかを確認します。パイソン - 要素の一部は、私は、この出力で設定したセット

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='' 
を無視

これは可能ですか?

+0

これは 'Rule'クラスに大きく依存し、' __hash__'メソッドと '__eq__'メソッドがどのように実装されています。 'Rule .__ hash__'と' Rule .__ eq__'が 'num'、' pkts'と 'bytes'フィールドを無視しない限り、マッチするものが見つかるまで、セット内のすべての' Rule'インスタンスをループする必要があります。 – mgilson

+0

'Rule(x、y、z)のset(Rule(x、y、z))'の 'Rule(x、y、z) –

答えて

0

未定義のコードですが、これはこれを行う方法の1つです。このルールをあらゆる種類の等価チェックに拡張する必要がある場合は、Ruleクラスの魔法__eq__(self, other)メソッドを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) 
+0

メソッドの変更を伴わないrule_in_setにtrueまたはfalseを返す方法はありますか? – mariahm24

+0

@ mariahm24あなたが何を意味するのか分かりません。どのような方法を変更しますか? – brianpck

+0

申し訳ありませんが、今週はPythonを見て始めました。変数に何か(rules_match(rule、i)for i)を設定し、その変数が空であればfalseを返し、そうでなければtrueを返します。 – mariahm24

関連する問題