扩展Python队列的正确方法?

6 投票
1 回答
4165 浏览
提问于 2025-04-17 08:15

我正在写一个自定义的队列类,遇到一个问题,就是在我的自定义 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

但是在线文档没有提到要重写它们。这个模块里的其他队列实现都重写了这些方法。所以,我有点倾向于相信 _put 方法是包内私有的,实际上并不打算在队列模块之外使用。

有没有人知道在我的自定义子类中使用 Queue._put 和相关方法是否合适?

1 个回答

2

在我看来,这完全是可以接受的。在Python中,源代码就是文档,或者说应该被视为发布的API文档的补充。这主要是因为Python强制使用空格和编码规范,这些规范强调代码要清晰易读:当你遇到文档没有解答的问题时,你应该能够去源代码中找到答案。

特别是像这样的细节对大多数使用Queue模块的用户来说并不重要(他们只是简单地在使用这些类),所以这些内容不会出现在发布的文档中。但是如果你想要继承Queue,开发者希望你能深入了解,所以这个提示就放在源代码里等你去发现。

我还想提到,Python其实并没有“包私有”这个概念。从语义上讲,同一个模块中的子类和不同模块中的子类(即使是你自己写的)没有区别。实际上,Python甚至没有“私有”这个概念。相反,它依赖于一种负责任的使用原则:作为开发者,你应该足够聪明,不在不需要的时候使用内部方法。以一个下划线开头的成员名称只是一个提示,表示这是一个内部方法,如果你只是使用这个类,可能不应该去访问它——但如果你在继承这个类,任何东西都可以使用。

撰写回答