Python 在 heapq 中遇到的坑

Python 的 Heapq 可以用来做快速排序使用, 例如我想做一个根据优先级决定处理顺序的功能, 初始化了一个 list:

l = [
    (23, socket.socket()),
    (25, socket.socket()),
    (30, socket.socket()),
    (26, socket.socket()),
    (13, socket.socket()),
]

那么当我在heapq.heappush 或者 pop 的时候就会出现问题, 原因是这个 socket 类型之间是不能被比较的:

socket.socket() > socket.socket()

TypeError: '>' not supported between instances of 'socket' and 'socket'

解决方法:

既然socket类型不能被比较, 那么我们找个可以被比较的类型不就好了吗

于是我首当其冲想到了:

在 int 里保存数据, 这样比较的时候只会比较 int 的大小

class myint(int):
    def __new__(cls, n, data):
        cls.data = data
        return  super(myint, cls).__new__(cls, n)



n = myint(1, socket.socket())
n2 = myint(2, socket.socket())


n
-> 1

n2
-> 2

n2 > n
True

这样两个数据就可以被比较了, 放到heapq里也不会报错, 调用数据的时候就用 n.data 即可

留下评论