0

下面是 Python 中的代码片段,它将 IP 前缀存储在基数树中,然后如果 IP 属于前缀,则将 IP 和 ASN 关联到字典中。

我想找出特定前缀的所有不同 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]>],....]

显然valseen_list;但是,if val not in seen_list:总是正确的并且val被附加了seen_list很多次。我不明白为什么条件总是返回真。是因为存储的对象的类型seen_list吗?

4

1 回答 1

2

目前,Cap'n Proto 阅读器不支持任何形式的“平等”比较。部分原因是不清楚平等应该意味着什么:应该是通过身份(如果两个读者指向完全相同的对象,则它们是相等的)还是应该是通过值(如果它们指向具有相同内容的对象,则它们是相等的)?

在任何情况下,都in需要一个实现__eq__来测试是否相等,而在 Cap'n Proto 的情况下没有这样的实现。可能最终发生的事情是 Python 正在按身份比较包装器对象——并且随着新包装器对象的不断创建,这些比较总是错误的。

为了得到您想要的,您可能需要将 Cap'n Proto 对象完全转换为可适当比较的纯 Python 对象。

于 2015-09-19T07:09:42.720 回答