在下面的代码中,a
和b
都是生成器函数的输出,可以计算为None
或具有值
def testBehaviour(self):
a = None
b = 5
while True:
if not a or not b:
continue
print('blaat')
如果我将断点(使用VisualStudio代码)放在带有continue
语句的行上,以及带有print
语句的行上,则两者都不会命中。不会调用print
语句,循环会像预期的那样无限期地运行,但我希望会命中断点
如果我将代码更改为以下之一:
def testBehaviour(self):
a = None
b = 5
while True:
if not a:
continue
print('blaat')
或:
def testBehaviour(self):
a = None
b = 5
while True:
if not a or not b:
c = 'dummy'
continue
print('blaat')
再次在带有continue
和print
语句的行上放置断点,断点被命中
谁能告诉我为什么断点没有命中?这似乎不仅仅发生在VisualStudio代码中,因为我们的代码覆盖率工具还声明没有调用continue
语句
这是在Windows7上的Python2.7上,32位
操作码中有一个优化,编译器识别
if expr: continue
当使用
if not a or not b:
如果
not a
为true,则行25 POP_JUMP_IF_TRUE 15
跳回while循环的开始(行15)。它永远不会到达continue语句的行35 JUMP_ABSOLUTE 15
如果您切换
a
和b
的值,这个测试用例可以工作如果将测试表达式重写为
if not ( a and b ):
,则会得到以下操作码这总是有效的,而且速度更快。
not
操作被优化到跳转测试语句中相关问题 更多 >
编程相关推荐