Python 3.7 的内置 breakpoint() 函数如何 backport 到 3.6 中?

2021-02-08 01:47:12 +08:00
 littleMaple

一个简单的 backport 实现是:

def breakpoint():
    import pdb
    pdb.set_trace()

可是这样做和原生 breakpoint() 的行为并不完全一致,这样做虽然也能进入调试器,但是比原生 breakpoint() 多了一个栈帧。我尝试在 CPython 的源码中寻找 breakpoint() 的官方实现,无奈以失败告终,只找到了其单元测试 TestBreakpoint .

2714 次点击
所在节点    Python
25 条回复
no1xsyzy
2021-02-08 09:26:29 +08:00
# breakpointbackport.py

def breakpoint():
   import pdb
   pdb.Pdb(skip=['breakpointbackport']).set_trace()
ungrown
2021-02-08 09:49:43 +08:00
不用太纠结完全一致吧,够用就行了
shniubobo
2021-02-08 10:01:07 +08:00
XIVN1987
2021-02-08 10:29:06 +08:00
python 解释器交互太简陋了,,建议用 ipdb 进入 ipython

import ipdb; ipdb.set_trace() # 设置断点

class ExceptionHook: # 异常启动 ipython
instance = None
def __call__(self, *args, **kwargs):
if self.instance is None:
from IPython.core import ultratb
self.instance = ultratb.FormattedTB(mode='Plain', color_scheme='Linux', call_pdb=1)
return self.instance(*args, **kwargs)
XIVN1987
2021-02-08 10:29:44 +08:00
python 解释器交互太简陋了,,建议用 ipdb 进入 ipython

import ipdb; ipdb.set_trace() # 设置断点

class ExceptionHook: # 异常启动 ipython
instance = None
def __call__(self, *args, **kwargs):
if self.instance is None:
from IPython.core import ultratb
self.instance = ultratb.FormattedTB(mode='Plain', color_scheme='Linux', call_pdb=1)
return self.instance(*args, **kwargs)
XIVN1987
2021-02-08 10:31:15 +08:00
python 解释器交互太简陋了,,建议用 ipdb 进入 ipython

``` python
import ipdb; ipdb.set_trace() # 设置断点

class ExceptionHook: # 异常启动 ipython
instance = None
def __call__(self, *args, **kwargs):
if self.instance is None:
from IPython.core import ultratb
self.instance = ultratb.FormattedTB(mode='Plain', color_scheme='Linux', call_pdb=1)
return self.instance(*args, **kwargs)
```
XIVN1987
2021-02-08 10:33:21 +08:00
python 解释器交互太简陋了,,建议用 ipdb 进入 ipython

import ipdb; ipdb.set_trace() # 设置断点

class ExceptionHook: # 异常启动 ipython
&nbsp ;&nbsp ; instance = None
&nbsp ;&nbsp ; def __call__(self, *args, **kwargs):
&nbsp ;&nbsp ;&nbsp ;&nbsp ; if self.instance is None:
&nbsp ;&nbsp ;&nbsp ;&nbsp ;&nbsp ;&nbsp ; from IPython.core import ultratb
&nbsp ;&nbsp ;&nbsp ;&nbsp ;&nbsp ;&nbsp ; self.instance = ultratb.FormattedTB(mode='Plain', color_scheme='Linux', call_pdb=1)
&nbsp ;&nbsp ;&nbsp ;&nbsp ; return self.instance(*args, **kwargs)
XIVN1987
2021-02-08 10:34:32 +08:00
python 解释器交互太简陋了,,建议用 ipdb 进入 ipython

import ipdb; ipdb.set_trace() # 设置断点

class ExceptionHook: # 异常启动 ipython
....instance = None
....def __call__(self, *args, **kwargs):
........if self.instance is None:
............from IPython.core import ultratb
............self.instance = ultratb.FormattedTB(mode='Plain', color_scheme='Linux', call_pdb=1)
........return self.instance(*args, **kwargs)
XIVN1987
2021-02-08 10:35:05 +08:00
@no1xsyzy

大佬,,你回复里的代码缩进怎么弄的??
no1xsyzy
2021-02-08 11:34:38 +08:00
@XIVN1987 全角空格(
XIVN1987
2021-02-08 11:47:51 +08:00
全角空格,试一下:

class ExceptionHook: # 异常启动 ipython
   instance = None
   def __call__(self, *args, **kwargs):
     if self.instance is None:
       from IPython.core import ultratb
       self.instance = ultratb.FormattedTB(mode='Plain', color_scheme='Linux', call_pdb=1)
     return self.instance(*args, **kwargs)
XIVN1987
2021-02-08 11:48:22 +08:00
@no1xsyzy

哇塞,,真的行了,,感谢大佬
byaiu
2021-02-08 12:17:47 +08:00
@XIVN1987 笑喷了
no1xsyzy
2021-02-08 12:24:18 +08:00
@XIVN1987 这个 ExceptionHook 是要实例化了以后放到 sys.excepthook 吗?

既然你提到了我所不知道的,那我就多嘴一句,hacker 大多偏左推崇人人平等从而不喜欢 “大佬” 这种叫法。
learningman
2021-02-08 12:26:12 +08:00
@no1xsyzy 但是算法竞赛的圈子流行这个
人均大佬神犇 (
XIVN1987
2021-02-08 12:36:55 +08:00
@no1xsyzy

是的,,抱歉拷贝不完整

class ExceptionHook:      # 异常启动 ipython
   instance = None
   def __call__(self, *args, **kwargs):
     if self.instance is None:
       from IPython.core import ultratb
       self.instance = ultratb.FormattedTB(mode='Plain', color_scheme='Linux', call_pdb=1)
     return self.instance(*args, **kwargs)

sys.excepthook = ExceptionHook()
XIVN1987
2021-02-08 12:42:22 +08:00
@byaiu

实在是 V2EX 回复中插入空格方式太奇葩了,,我都注册六年了今天才学会,,
loliordie
2021-02-09 00:58:23 +08:00
@XIVN1987 可以用 markdown 的插入代码语法吧

```python
print("hello world")
```
试一下
loliordie
2021-02-09 00:58:52 +08:00
@loliordie 好吧回复居然不支持 markdown 语法...
littleMaple
2021-02-10 16:48:17 +08:00
@no1xsyzy #1 感谢答复,试了一下,确实有用!看来是我没有细看 pdb 模块的文档的锅.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/752234

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX