扩展Python队列的正确方法?

Ric*_*eur 5 python queue

我正在编写Queue.Queue的自定义子类,并遇到需要put()在调用自定义时获取队列级锁定的情况.我想重用现有的锁Queue has(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
Run Code Online (Sandbox Code Playgroud)

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

有谁知道Queue._put在我自己的子类中使用和朋友是多么的犹太人?

Dav*_*d Z 2

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

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

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