扩展Python队列的正确方法?

扩展Python队列的正确方法?,python,queue,Python,Queue,我正在编写Queue.Queue的自定义子类,并遇到这样一种情况:当调用我的自定义put()时,我需要获取队列级锁。我想重用现有的锁队列有(Queue.mutex),但不能,因为它不是RLock 在源代码(python 2.6)中,它说: # Override these methods [_put, _get, etc] to implement other queue organizations # (e.g. stack or priority queue). # These will o

我正在编写Queue.Queue的自定义子类,并遇到这样一种情况:当调用我的自定义
put()
时,我需要获取队列级锁。我想重用现有的锁队列有(
Queue.mutex
),但不能,因为它不是
RLock

在源代码(python 2.6)中,它说:

# Override these methods [_put, _get, etc] to implement other queue organizations
# (e.g. stack or priority queue).
# These will only be called with appropriate locks held
但是在线文档没有提到覆盖它们。该模块中的其他队列实现将覆盖这些队列。因此,我倾向于认为
\u put
方法是包私有的,并不真正用于队列模块之外


有人知道使用
队列有多洁净吗?\u把
和朋友放在我自己的子类中?

就我而言,这是完全洁净的。在Python中,或至少应将其视为已发布API文档的补充。这在很大程度上是强制使用空格和编码约定的结果:当您有文档无法回答的问题时,您应该能够转到源代码并查找答案

特别是,像这样的细节与
队列
模块的大多数客户机(他们只是在使用类)无关,因此他们不会将其放入已发布的文档中。但是,如果您想将
Queue
子类化,开发人员希望您能够深入挖掘,因此,在源代码中有注释供您查找


我还将提到Python实际上没有“包私有”的概念。从语义上讲,同一模块中的子类和不同模块中的子类之间没有区别,即使是您自己编写的子类。事实上,Python甚至没有“私有”的概念。相反,它依赖于负责任的使用原则:作为一名开发人员,你应该足够聪明,在不需要的时候不使用内部方法。以下划线开头的成员名只是一个线索,表明它是一个内部方法,如果您只是使用类,那么可能不应该访问它——但如果您将其子类化,任何事情都是公平的。

对于“源是文档”这一问题,您是否有比您自己的答案更权威的来源?我看到了关于python开发的各种讨论,讨论了在没有正式文档的情况下,应该从stdlib中假设什么可见性。我没有考虑的另一点是,队列在3.2中本质上是相同的,因此我不必担心升级问题。不,我不担心,这只是我在使用Python编程的几年中学到的一种感觉。在任何情况下,我都不想让这个链接成为一个来源或拥有任何形式的权威;我只是想在某个地方工作,因为我记得最近写了那个答案,我认为进一步阅读会很有趣。事实上:我想我可能在更权威的地方读过,该来源应该被视为文档的补充,或者类似的东西。但我不记得任何细节。