问题 调试where方法返回None


我有一个很大的遗留Python方法,大约有二十个 return 声明。

该方法不应该返回 None 但它确实如此。它在一个简单的测试用例中是可重复的。

到目前为止,我使用了一个调试器并逐行遍历代码以找到匹配的return语句。

但有更简单的方法吗?

一旦方法返回None,有没有办法引发异常?

当然我需要看到包含return语句的行。

例:

def big_method(arg1, some_var):
    #.... many returns
    if arg1:
        return some_var # <------
    #... many returns


assert not big_method(True, None) is None

上面是一个简单的代码片段。结果:

Traceback (most recent call last):
  File "/home/modwork_vums_d/src/manyreturns.py", line 8, in <module>
    assert not big_method(True, None) is None
AssertionError

以上追溯并没有多大帮助,因为我想看到这条线   big_method()。在上面的例子中,我想看看我标记的是哪个 <------

我使用PyCharm,但欢迎使用纯python或其他解决方案。

仅供记录。有一个后续问题试图在PyCharm中启用此功能: PyCharm:调试:r(eturn)继续执行,直到当前函数返回


12150
2017-12-13 09:16


起源

有一种可能的解决方案: stackoverflow.com/a/1156048/5588279。 - Sraw
我想知道这是可能的,执行big_method的框架已经被收回了。 - georgexsh
也许你可以利用解释器的跟踪功能,记录被调用函数的执行路径,然后在外部断言失败时打印出来。 - georgexsh
但是当你使用调试器时,我想它应该有一个像“运行直到当前函数返回”的功能,它将停在您需要的行。 - georgexsh
@guettli pdb的链接 r 命令文档 - georgexsh


答案:


pdb有一个 r(eturn) 这个需求的命令:

返回)   继续执行,直到当前函数返回。

例:

> /Users/georgexsh/wasteland/tmp/app.py(6)<module>()
-> assert not big_method(True, None) is None
(Pdb) s
--Call--
> /Users/georgexsh/wasteland/tmp/app.py(1)big_method()
-> def big_method(arg1, some_var):
(Pdb) r
--Return--
> /Users/georgexsh/wasteland/tmp/app.py(3)big_method()->None
-> return some_var

看到更多细节 pdb doc


13
2017-12-14 08:39