我正在尝试根据dict是否存在(不是True
)以及是否包含值来获取布尔False
或None
值。
这是我的代码。我希望enabled == False
,但会为其分配值cfg
。
In [105]: cfg = {}
In [106]: is_enabled = cfg and cfg.get('enabled')
In [107]: is_enabled
Out[107]: {}
为什么is_enabled == {}
?这肯定是一个明显的错误,但我没有看到它。
答案 0 :(得分:4)
欢迎来到短路布尔运算符的世界。在表达式cfg and ANYTHING
中,由于cfg为空,因此它的布尔值为False。因此,永远不会评估第二个操作数。表达式的结果是第一个操作数,即{}
。请注意,表达式0 and None
的值为0,但表达式1 and None
的值为None!
也许您希望该行读取is_enabled = bool(cfg) and cfg.get('enabled')
或甚至只读is_enabled = cfg.get('enabled',False)
。
答案 1 :(得分:2)
取决于您实际想要重写的内容
cfg
if cfg
仅在{{1}}等布尔上下文中计算为False。
答案 2 :(得分:0)
这样做
is_enabled = cfg is not None and 'enabled' in cfg