为什么 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" 会鼓励非专家使用它。
与大多数序列类型(如 list
和 deque
)不同,queue.Queue
专门打算 用于多线程上下文(对于 multiprocessing
模块的队列类型也是如此)。虽然 Queue
中的项目数在任何特定时间肯定有一个确定的值,但用户代码不可能找出该值是什么:在调用 .qsize()
[=42= 的时间之间] 并且您的代码可以 查看 返回值,任意数量的其他线程(或进程,在 multiprocessing
情况下)可能对队列的内容进行了任意数量的更改.
所以关于 .qsize()
返回的值唯一可以说的是 Queue
在 一些 过去的时间。当您可以使用返回值时,它可能包含任意多(或少)的值。
当然,如果你只有 运行 一个线程,情况就不是这样了——但是这样就不需要为 Queue
的实现复杂性付出代价(使用 list
或取而代之的是 deque
)。
内置函数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" 会鼓励非专家使用它。
与大多数序列类型(如 list
和 deque
)不同,queue.Queue
专门打算 用于多线程上下文(对于 multiprocessing
模块的队列类型也是如此)。虽然 Queue
中的项目数在任何特定时间肯定有一个确定的值,但用户代码不可能找出该值是什么:在调用 .qsize()
[=42= 的时间之间] 并且您的代码可以 查看 返回值,任意数量的其他线程(或进程,在 multiprocessing
情况下)可能对队列的内容进行了任意数量的更改.
所以关于 .qsize()
返回的值唯一可以说的是 Queue
在 一些 过去的时间。当您可以使用返回值时,它可能包含任意多(或少)的值。
当然,如果你只有 运行 一个线程,情况就不是这样了——但是这样就不需要为 Queue
的实现复杂性付出代价(使用 list
或取而代之的是 deque
)。