В Python я довольно привык к контейнерам объектов, имеющих правдивое поведение, когда они заполнены, и ложное поведение, когда их нет:
# list
a = []
not a
True
a.append(1)
not a
False
# deque
from collections import deque
d = deque()
not d
True
d.append(1)
not d
False
# and so on
Однако queue.Queue не имеет такого поведения. Мне это кажется странным и противоречит практически любому другому типу данных контейнера, о котором я могу думать. Кроме того, метод empty
в очереди, кажется, идет вразрез с соглашениями о кодировании, которые избегают условий гонки для любого другого объекта (проверка, существует ли файл, проверка, пустой ли список, и т. Д.). Например, мы обычно говорим, что следующее - это плохая практика:
_queue = []
if not len(_queue):
# do something
И должно быть заменено на
_queue = []
if not _queue:
# do something
или для обработки IndexError
, что, как мы все еще можем утверждать, будетлучше с оператором if not _queue
:
try:
x = _queue.pop()
except IndexError as e:
logger.exception(e)
# do something else
Тем не менее, Queue
требует, чтобы кто-то сделал одно из следующих действий:
_queue = queue.Queue()
if _queue.empty():
# do something
# though this smells like a race condition
# or handle an exception
try:
_queue.get(timeout=5)
except Empty as e:
# do something else
# maybe logger.exception(e)
Есть ли где-нибудь документация, которая может указывать на почему этот выбор дизайна был сделан? Это кажется странным, особенно когда исходный код показывает, что он был построен поверх collections.deque
(отмечается, что очередь не наследуется от deque
)