【问题标题】:How to break on `pass` in pycharm如何在pycharm中打破`pass`
【发布时间】:2018-05-17 10:56:30
【问题描述】:

在 pycharm 中,我想在调试期间中断一个什么都不做的断点。我该怎么做?

例如,我想打破pass 声明:

for i in range(999999):
    if i == 6232:
        pass

如果我在pass 上设置断点,调试器不会在那里中断。到目前为止,我能做的最接近的事情是组成一些未使用的变量名,并为其分配一个毫无意义的值,这样我就可以在那一行设置一个断点:

for i in range(999999):
    if i == 6232:
        foobar_unused_variable = "At least I can set a breakpoint on this line."

【问题讨论】:

  • 我也遇到过这种情况——通常我只是放了一些 noop 语句(例如i,它是有效的python,但什么都不做)。这具有被 pylint 拾取的额外好处,所以我不会意外提交它。
  • pass表示什么都不做,编译时决定什么都不做,所以pass处没有可执行代码,最后调试器无法调试nothing
  • @Sraw 这似乎是错误的,因为这正是“nop”的用途,所以调试器可以调试“什么都没有”我错了吗?
  • @LazNikolajAndersen AFAIK,你错了。首先,调试器只能调试真正执行的内容,它不能在不存在的地方中断。其次,image 如果你是那个编译器的作者,你肯定会尽最大努力优化和减少冗余代码。在这种情况下,您会在目标代码中添加完全无用的代码吗?你肯定不会,因为不管它需要执行多少时间,这是一种浪费。
  • @Sraw 例如,条件断点if <condition here>: pass很有用,如果在pass中添加break,则只有条件为真时才会执行该语句。

标签: python debugging pycharm


【解决方案1】:

当即时编译器编译您的示例时,它编译为 pass 为空。换句话说,pass 只是一个关键字,应该用来告诉编译器没有语法错误,否则会是一个空块。例如,尝试在没有pass 的情况下运行代码。不会工作。您也可以尝试使用未使用的表达式(例如0)或无效果的语句(例如print(end=''))代替pass。但我建议尽可能删除这些。您还可以设置conditional breakpoint,而不是在if 语句中中断。

更新:从 Python 3.7+ 开始,现在可以使用内置的 breakpoint() function

【讨论】:

    【解决方案2】:

    使用省略号!

    对于快速断点或对您的代码造成最小视觉影响的东西,您可以在 ...(省略号)上插入和中断:

    例如:

    while some_condition():
        do_something()
        ...  #  <<< set break point here!
    

    这可能是对我最干净的方式。

    一些背景

    Ellipsis 是一个特殊的内置 python 对象,主要用于 Slice 标记。在这里,我(ab)用它来做其他事情。见:What does the Python Ellipsis object do?

    可以在代码中插入一个裸整数、变量名或其他内容以在某个位置设置断点,但它可能看起来很奇怪并且会使您的代码混乱,但... 在视觉上是无害的。比较一下:

    break_point = 0
    while some_condition():
        do_something()
        break_point # <<< set break point here!
    

    或者这个:

    while some_condition():
        do_something()
        if False: # <<< set break point here!
            pass
    

    测试了其他一些技巧:

    del []  # works(with warning: "cannot assign to []")
    []  # works(with warning: Statement seems to have no effect)
    setbreakpoint = 1  # works(with warning: "local variable value is not used")
    Ellipsis  # works(with warning: Statement seems to have no effect)
    

    发生在我身上的另一件有趣的事情是,当我在pass 上设置断点时,它可能会中断,也可能不会中断,具体取决于它在代码中的位置,但中断与否的确切规则尚不清楚。

    【讨论】:

    • 不错的尝试,但是......当我简单地将 ...3 粘贴到代码中并在其上设置断点时......它不会中断。我猜一些编译优化器正在优化它......即使我输入if False: 并尝试打破它,它也不会中断。更多证据表明编译器会对其进行优化。 ¯\_(ツ)_/¯
    • 嗨@Edward,我已经在PyCharm Community 2017.3 中使用cpython 插件(没有ipython)尝试过这个,它会在裸变量...if False: 上中断,但不会在@ 上中断987654336@或3,你用的是什么IDE?
    • 有趣...我正在使用 PyCharm Pro 2018.2.4。你说cpython,但你的意思是cythoncomparison matrix 说你需要专业人士来支持cython
    • 啊,是的,它的 Cython。 (在新的 PyCharm 安装中,它会经常提示用户安装 Cython 扩展以加快调试速度,我点击安装链接只是为了让它安静,如 jetbrains.com/help/pycharm/cython-speedups.html 所述:“谢天谢地,Python 通过以下方式支持编译的 C 扩展Cython。PyCharm 附带 C 版本的调试器代码,您可以对其进行编译以加快 PyCharm 中的调试速度。”) @Edward
    • 在 PyCharm 社区 2020.2 中表现出色。非常感谢!
    【解决方案3】:

    正如其他人所说,没有干净的方法可以做到这一点。我建议不要通过,输入一个无用的语句例如

    dbg = True
    

    然后在该行设置断点。

    优点:

    1. 它允许您在此处设置断点。 (你想做的事。)
    2. 一旦你习惯了这个成语,你就会知道它的真正含义。
    3. 您可以不时检查您的代码并删除不再使用的旧代码。

    缺点:

    1. 如果您不定期删除它们,它会使您的代码变得混乱。
    2. 合作者可能会对您在做什么感到困惑。
    3. 如果将它们留在生产代码中,可能会对性能造成轻微影响(取决于 Python 是否优化它们)。

    【讨论】:

      【解决方案4】:

      断点函数

      breakpoint() 适合:

      • Python >= 3.7
      • 内置代码清理提醒。
      • 始终处于活动状态;无法通过单击鼠标来关闭它。

      虚拟打印语句

      但是当我想打开和关闭它时,我使用了一个打印功能,而不是通过() 实际调用它;像这样:

      for i in range(999999):
          print                 # Toggle breakpoint on this line
      

      虚拟变量赋值

      这比分配一个虚拟变量要好,因为它不会弄乱我的命名空间(这使得调试更容易),而且 PyCharm 不会警告我未使用的变量。

      椭圆

      省略号解决方案在我的 PyCharm 上对我不起作用。

      【讨论】:

        猜你喜欢
        • 2019-10-23
        • 2011-10-02
        • 2011-08-15
        • 2017-01-11
        • 2015-05-02
        • 1970-01-01
        • 1970-01-01
        • 2022-01-26
        • 2018-09-05
        相关资源
        最近更新 更多