在 PEP 553breakpoint()
实用程序之前的 python 版本中,添加(理想情况下是单行)代码以具有可以在条件下忽略的断点的推荐方法是什么(例如,全局调试标志或 args.debug 标志)。
在 Perl 中,我习惯使用$DB::single=1;1;
单行,我知道我可以安全地将其留在代码中,并且不会影响正常运行,perl code.pl
除非显式调用perl -d code.pl
. 例如:
my $a = 1;
$DB::single=1;1; # breakpoint line
my $b = 2;
print "$a $b\n";
如果我将此代码运行为:perl code.pl
,它将运行完成。如果我使用: 运行此代码perl -d code.pl
,pdb
则将在断点行处停止(而不是在带有my $b = 2;
语句的下一行之前),因为它包含1;
语句之后的$DB::single=1;
语句;
同样,如果我写:
my $debug = 1;
my $a = 1;
$DB::single=$debug;1; # first breakpoint line
my $b = 2;
$DB::single=$debug;1; # second breakpoint line
print "$a $b\n";
# [...] Lots more code sprinkled with more of these
$DB::single=$debug;1; # n'th breakpoint line
然后我可以执行perl -d code.pl
,它将在第一个断点行停止,然后在pdb
会话中,一旦我很高兴它不需要在其他任何地方停止,然后执行:$debug = 0
,然后pdb
继续c
,这将使它不会在第二个或其他处停止代码中的类似断点行。
我怎样才能在python(PEP 553之前的2.x和3.x)中实现相同的目标,理想情况下是单行语句?
我知道 PEP 553,除了必须明确设置PYTHONBREAKPOINT=0 python3.7 code.py
或注释掉这些breakpoint()
行的麻烦之外,它是这里问题的解决方案。
我想到了以下选项:
import pdb; pdb.set_trace()
dummy=None;
下面的语句pdb.set_trace()
是为了让我可以在 Perl1;
之后的同一行中实现相同的$DB::single=1;
效果,即让调试器停止我放置断点的位置,而不是下一条语句。这样如果中间有大块的注释代码或文档,调试器就不会跳转到离断点很远的下一条语句。
或使用以下条件:
if args.debug or debug:
import pdb; pdb.set_trace()
_debug=False; #args.debug=False
因此,如果我完成了脚本的调试,我可以设置args.debug=False
或debug=False
不必触及代码中的所有这些断点。