- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在 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/
我试图弄清楚接受 OpenID 登录的网站如何无法通过简单的主机文件更新来指向伪造的 OpenID 提供商。 假设我想侵入 Joe Smith 的帐户,在这个例子中,假设他的 OpenID 提供商是
#include #include #include #include #include #include #include #include #include #include #define P
根据此讨论 - "RESTful API - Correct behavior when spurious/not requested parameters are passed in the req
如果编译为 Cand C++ 源代码,这个简单的代码片段会使用 g++ 4.7.0 生成“函数调用中缺少标记”警告。我相信这是编译器的错误,因为最终的 NULL值(value)就在那里。 #inclu
我读到,有时 && 运算符用于“短路”JavaScript,使其相信返回值 0 是 0 而不是 NaN,因为 0 在 JavaScript 中是一个虚假数字。我一直在四处寻找,想弄清楚这一切意味着什么
我正在使用 Borland(又名“Embarcodegearland”)C++Builder 2007 编译器,它有一个小错误,系统头文件中的某些 static const 项可能导致虚假的 "xyz
我是一名优秀的程序员,十分优秀!