扩展Python队列的正确方法?

时间:2011-12-12 23:52:13

标签: 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 only be called with appropriate locks held

但在线文档没有提及覆盖它们。该模块中的其他Queue实现会覆盖这些。所以,我有点倾向于认为_put方法是包私有的,并不是真的打算在Queue模块之外使用。

有谁知道在我自己的子类中使用Queue._put和朋友会有多犹豫不决?

1 个答案:

答案 0 :(得分:3)

就我而言,它将完全是犹太人。在Python中,the source is the documentation或者至少应该被视为已发布的API文档的补充。这主要是强制使用空白和编码约定的结果emphasize clear, readable code:当您有文档没有回答的问题时,您认为能够去源代码并查找答案。

特别是,像这样的详细信息与Queue模块的大多数客户端无关(他们只是使用类),因此他们不会将其纳入已发布的文档中。但是如果你想要继承Queue,那么开发人员希望你能够深入挖掘,所以你可以在源代码中找到这些注释。

我还要提到Python并没有真正的“包私有”概念。从语义上讲,同一模块中的子类与不同模块中的子类之间没有区别,即使是自己编写的子类也是如此。实际上,Python甚至没有“私有”的概念。相反,它依赖于负责任使用的原则:作为开发人员,您需要足够聪明,不要在不需要时使用内部方法。使用下划线启动成员名称只是一个线索,它是一个内部方法,如果你只是使用类,你可能不应该访问它 - 但是如果你是子类化它,什么都是公平的游戏。