为什么 len() 没有为队列实现?

Why is len() not implemented for Queues?

内置函数len() (https://docs.python.org/3/library/functions.html#len) returns "the length (the number of items) of an object", but this is not implemented for queue.Queue (https://docs.python.org/3/library/queue.html)。 相反,queue.Queue 有一个 qsize() 方法,它 returns 队列的近似大小,当它明显有一个长度时;您可以在构造函数中指定 Queue 的最大长度。类似的 collections.deque 确实适用于 len

queue.Queue不使用通用len()的原因是什么?或者:如果将 qsize 命名为 __len__ 以启用 len() 功能,将会出现什么问题?

len() 没有为 queue.Queue 实现,因为它将是一个 "attractive nuisance":只有专家才应该考虑使用的东西,但是 "friendly name" 会鼓励非专家使用它。

与大多数序列类型(如 listdeque)不同,queue.Queue 专门打算 用于多线程上下文(对于 multiprocessing 模块的队列类型也是如此)。虽然 Queue 中的项目数在任何特定时间肯定有一个确定的值,但用户代码不可能找出该值是什么:在调用 .qsize() [=42= 的时间之间] 并且您的代码可以 查看 返回值,任意数量的其他线程(或进程,在 multiprocessing 情况下)可能对队列的内容进行了任意数量的更改.

所以关于 .qsize() 返回的值唯一可以说的是 Queue 一些 过去的时间。当您可以使用返回值时,它可能包含任意多(或少)的值。

当然,如果你只有 运行 一个线程,情况就不是这样了——但是这样就不需要为 Queue 的实现复杂性付出代价(使用 list 或取而代之的是 deque)。