gpt4 book ai didi

python - 为什么python Queue没有虚假行为

转载 作者:太空宇宙 更新时间:2023-11-04 11:11:14 26 4
gpt4 key购买 nike

在 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)

是否有文档可以指出为什么做出这种设计选择?这看起来很奇怪,尤其是当 the source code表明它是建立在 collections.deque 之上的(注意 Queue 继承自 deque)

最佳答案

根据truth value testing的定义程序,行为是预期的:

Any object can be tested for truth value, for use in an if or while condition or as operand of the Boolean operations below.

By default, an object is considered true unless its class defines either a __bool__() method that returns False or a __len__() method that returns zero, when called with the object.

由于 Queue 既没有实现 __bool__() 也没有实现 __len__() 那么它的真值为 True。至于Queue为什么没有实现__len__(),可以在qsize函数的注释中找到线索:

'''Return the approximate size of the queue (not reliable!).'''

__bool__() 函数也是如此。

关于python - 为什么python Queue没有虚假行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58176203/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com