【发布时间】:2022-11-02 19:21:30
【问题描述】:
我在 macOS Monterey 12.6.1 上的 PyCharm Build #PY-222.4345.23 中遇到了这种行为,这发生在 python 3.10 和 3.11 中。
def example(i):
match i % 4:
case 0:
if i > 10:
return 0
case 1:
if i > 10:
return 1
case 2:
if i > 10:
print(f'{i}, {i > 10}')
return 2
case 3:
if i > 10:
return 3
if __name__ == '__main__':
print(example(2))
在这两个 python 版本中,调试器在第 3 个返回语句处停止(意外,块应该无法访问),但实际上并没有返回任何给定输入 2 的预期行为
python 3.11(1个断点重现)
python 3.10(2个断点重现)
如果 switch 和 case 被替换为 if/elif 块,则永远不会到达相同的断点,这正是我期望 switch 块的行为。
def example(i):
j = i % 4
if j == 0:
if i > 10:
return 0
elif j == 1:
if i > 10:
return 1
elif j == 2:
if i > 10:
print(f'{i}, {i > 10}')
return 2
elif j == 3:
if i > 10:
return 3
if __name__ == '__main__':
print(example(2))
【问题讨论】:
-
我不明白你在期待什么。断点只是在该行之前暂停执行,所以在
return 2之前。如果您继续(例如逐行),调试器将执行return,因此您将拥有2。但是在你的代码中,return 2永远不应该被执行。仅当i > 10时,您才调用return 2,但您有i = 2,所以没有返回。请更好地说明您的期望和得到的。 -
断点应该是不可到达的,因此它不应该因为
i = 2而停止。 -
我已经在完全相同的 PyCharm 构建(社区版)Python 3.10 上进行了尝试,但是 Windows 10 和我无法重现报告的行为。我只得到了
example(14)的断点,而不是example(2) -
你用了多少个断点?如果不是 2,请尝试放置第二个,如上面的屏幕截图所示。
-
好的,是的,我明白了。我需要设置两个断点来重现。它现在到达第二个断点。
标签: python debugging pycharm breakpoints