检查是否存在密钥但是即使密钥不存在,下面的代码也会评估为True。这是正确的和pythonic方式吗
a={u'is_l': 0, u'importance': 1, u'release_id': u'12345', u'company': 1 }
if 'verision' and 'importance' in a:
//evaluates to True why ?
答案 0 :(得分:0)
Python为你添加括号:
if 'verision' and ('importance' in a):
由于所有非空字符串都是真实的,因此评估为True
。
如果您有两个以上的元素,最好将all
与列表一起使用:
if all(el in a for el in ['verision', 'importance', ...]):
答案 1 :(得分:0)
因为表达式的分组就像 -
if (!mainVC.isInitialStart)
{
CGRect openedFrame = mainVC.currentActiveNVC.view.frame;
[mainVC.currentActiveNVC.view removeFromSuperview];
mainVC.currentActiveNVC.viewControllers = nil;
mainVC.currentActiveNVC = nil;
mainVC.currentActiveNVC = destinationNVC;
mainVC.currentActiveNVC.view.frame = openedFrame;
navItem = destinationNVC.navigationBar.topItem;
}
并且if ('verision') and ('importance' in a):
字符串在布尔上下文中是'version'
(布尔上下文中只有空字符串是True
,所有其他非空字符串都是True,请阅读更多关于它{{3} })。 ,因此它会使False
条件短路并返回and
。你想要 -
True
对于只有2个键,我建议上面的版本,但是如果你有2个以上的键,你可以按here的注释中的建议创建一组这些键,并检查该组是否是一个子集字典键。示例 -
if 'verision' in a and 'importance' in a:
演示 -
needs = set(['version','importance','otherkeys'..]) #set of keys to check
if needs.issubset(a): #This can be written as a single line, but that would make the line very long and unreadable.