【问题标题】:Why is the __cmp__ of a tuple element used for the tuple itself when put into a Queue.PriorityQueue?当放入 Queue.PriorityQueue 时,为什么元组元素的 __cmp__ 用于元组本身?
【发布时间】:2016-01-14 15:15:26
【问题描述】:

如果我在python 2.7.10 这样做

import Queue

class Item(object):
    def __init__(self):
        self.name = "bla"

    def __cmp__(a, b):
        return cmp(a.name, b.name)

e_queue = Queue.PriorityQueue()
e_queue.put((1,2))
item = Item()
e_queue.put((1, item))

第二个put 失败

...
  File "/usr/lib/python2.7/Queue.py", line 136, in put
    self._put(item)
  File "/usr/lib/python2.7/Queue.py", line 225, in _put
    heappush(self.queue, item)
  File "tuple_nonsense.py", line 10, in __cmp__
    return cmp(a.name, b.name)

显然Item__cmp__ 应用于包含它的tupleThe Queue docs 甚至建议使用元组作为项目:

条目的典型模式是元组,格式为:(priority_number, data)。)

那么,这里有什么问题?

【问题讨论】:

    标签: python python-2.7 queue


    【解决方案1】:

    在 Python 中,when you compare sequences, the elements in them are compared on by one。因此,当比较元组(1, 2)(1, item) 时,第一个元素是相同的。因此,比较第二个元素以确定哪个更小。既然你有2item,并且item 实现了__cmp__,它就会调用那个函数。

    您可以通过简单的print 声明来确认这一点,就像这样

    class Item(object):
    
        def __init__(self):
            self.name = "bla"
    
        def __cmp__(a, b):
            print a, b
            return cmp(a.name, b.name)
    

    这里a 将是item 对象,b 将是2。由于2 没有name 属性,因此失败并显示

    AttributeError: 'int' 对象没有属性 'name'

    【讨论】:

      猜你喜欢
      • 2019-01-14
      • 1970-01-01
      • 2020-11-30
      • 1970-01-01
      • 2015-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      相关资源
      最近更新 更多