【问题标题】:PyCharm stops at a breakpoint where it shouldn'tPyCharm 在不应该的断点处停止
【发布时间】:2022-11-02 19:21:30
【问题描述】:

我在 macOS Monterey 12.6.1 上的 PyCharm Build #PY-222.4345.23 中遇到了这种行为,这发生在 python 3.103.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


【解决方案1】:

IDE 错误。我已经在 PyCharm 的问题跟踪器中提交了一张票 - https://youtrack.jetbrains.com/issue/PY-57125/PyCharm-stops-on-non-hit-breakpoint-inside-pattern-matching-block

【讨论】:

    猜你喜欢
    • 2015-02-08
    • 2020-08-31
    • 2015-09-11
    • 2019-03-10
    • 2021-04-24
    • 2013-07-20
    • 2019-04-29
    • 2012-07-15
    • 2011-05-22
    相关资源
    最近更新 更多