0

以下は、基数ツリーに IP プレフィックスを格納し、IP がプレフィックスに属している場合は、IP と ASN をディクショナリに関連付ける Python のコード スニペットです。

特定のプレフィックスのさまざまな ASN をすべて見つけたいと考えています。詳細を以下に示します。

#rtree is a radix tree which has prefixes stored.
rtree = radix.Radix()    
with open(path-to-prefix-file,'r') as fp:
    for line in fp:
        rnode = rtree.add(line)  # Eg, Prefixes like "192.168.2.0/24"
        rnode.data["count"]= 0
...        
# The code has several lines here for processing a capnproto - skipping them.

rnode.data[IP]=asn_complete  # I read a Capnproto buffer and store IP and asn_complete

...

for rnode in rtree:
    seen_list = []  # defining a list to store different val, i.e.,asn_complete values
    if rnode.data["count"] > 1:
            """  Iterate through the rnode.data dictionary """
            for ip,val in rnode.data.iteritems():
                    if val not in seen_list:  # Condition is always satisfied!!
                            seen_list.append(val) 

例:valは、いくつかの反復で protobuf から次の値を取得します。

[<capnp list reader [15169]>, <capnp list reader [1239]>, <capnp list reader [4837]>]

を印刷するとseen_list

[[<capnp list reader [15169]>, <capnp list reader [1239]>, <capnp list reader [4837]>], [<capnp list reader [15169]>, <capnp list reader [1239]>, <capnp list reader [4837]>], [<capnp list reader [15169]>, <capnp list reader [1239]>, <capnp list reader [4837]>],....]

明らかvalに入っていseen_listます。しかし、if val not in seen_list:常に真であり、何度もval追加されます。seen_list条件が常に true を返す理由がわかりません。に格納されているオブジェクトの種類が原因seen_listですか?

4

1 に答える 1

2

現在、Cap'n Proto リーダーは、いかなる種類の「等しい」比較もサポートしていません。これは部分的には、等価性が何を意味するべきかが明確でないためです: 同一性によるべきか (2 人のリーダーがまったく同じオブジェクトを指している場合は等しい)、または値によるべきか (同等のコンテンツを持つオブジェクトを指している場合は等しい)?

いずれにせよ、同等性をテストするためinに の実装が必要ですが__eq__、Cap'n Proto の場合、そのような実装はありません。おそらく最終的に起こるのは、Python がラッパー オブジェクトを ID で比較しているということです。新しいラッパー オブジェクトが作成され続けると、これらの比較は常に偽になります。

必要なものを取得するには、Cap'n Proto オブジェクトを適切に比較できるプレーンな Python オブジェクトに完全に変換する必要があります。

于 2015-09-19T07:09:42.720 に答える