V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JYLu
V2EX  ›  程序员

如何高效地调试 py 程序?

  •  
  •   JYLu · 2022-10-08 10:03:08 +08:00 · 3149 次点击
    这是一个创建于 538 天前的主题,其中的信息可能已经有所发展或是发生改变。
    实现一些数值计算的算法,主要的精力都集中在把算法中的数学语言转化成编程代码了。代码质量就不高。常会出现很多小错误。py 没有编译,找错只能靠不断运行发现,但是这样一次只能改一个 bug 。每次调试都要比写下程序本身花数倍的时间,对精力是极大的损耗。
    还有除了使用 print()语句,有没有什么好的调试技巧,可以使得调试更高效?
    31 条回复    2022-10-08 18:24:14 +08:00
    flyaway
        1
    flyaway  
       2022-10-08 10:07:28 +08:00
    Yourshell
        2
    Yourshell  
       2022-10-08 10:10:04 +08:00
    除了 print 还可以使用 logging
    MaxLv
        3
    MaxLv  
       2022-10-08 10:12:48 +08:00
    pycharm debug 好使
    vone
        4
    vone  
       2022-10-08 10:16:38 +08:00
    siluni
        5
    siluni  
       2022-10-08 10:17:21 +08:00   ❤️ 1
    用 pytest 写单元测试吧
    kmyq
        6
    kmyq  
       2022-10-08 10:18:57 +08:00
    pycharm 直接调试就挺好使的啊
    v2exblog
        7
    v2exblog  
       2022-10-08 10:24:05 +08:00
    没用 Py 搞过复杂的数值计算并且调试,计算应该会有输入和中间结果吧?多在关键点打点 log🉑️吗,有的时候服务很难调试,只能通过看 log 判断哪儿有问题
    arischow
        8
    arischow  
       2022-10-08 10:26:50 +08:00 via iPhone
    这跟有没有编译没有直接关系吧
    dantangfan
        9
    dantangfan  
       2022-10-08 10:30:21 +08:00
    yuelang85
        10
    yuelang85  
       2022-10-08 10:45:26 +08:00
    @dantangfan 这个 pylane 相当不错,目测可以在线 debug 生产环境进程
    CamD
        11
    CamD  
       2022-10-08 10:48:05 +08:00 via iPhone
    spyder 听说不错
    qq976739120
        12
    qq976739120  
       2022-10-08 10:57:52 +08:00
    之前也做过一些把论文翻译成代码的工作, 尽量一段段写或者抽离成一个个小函数,确认没问题了再写下去. 全部写完整体测然后找中间的 bug,真的很头疼很头疼. 后来就是重写的.
    JYLu
        13
    JYLu  
    OP
       2022-10-08 11:09:31 +08:00
    @arischow 主要是编译的过程可以一次性发现许多结构性的问题,比如类型错误,什么的。现在就是每次测试都要跑一遍,每跑一遍只能发现一个错误,就很折磨。
    Anarchy
        14
    Anarchy  
       2022-10-08 11:12:28 +08:00
    看楼主需求指编译对等工作,那就对应 lint 工具这块做的好不好了,pycharm 应该能满足吧。
    pepesii
        15
    pepesii  
       2022-10-08 11:16:01 +08:00
    可以尝试下接入一些监控相关的东西, 例如 sentry
    可以加入一些 dataclass 或者 pydantic 的验证
    尽可能的把函数或者模块抽离的更细粒度一些,确保每个模块级别的东西没有问题,input 和 output 能得到保证
    JYLu
        16
    JYLu  
    OP
       2022-10-08 11:17:21 +08:00
    @siluni 谢谢,我试一试。
    TimePPT
        17
    TimePPT  
       2022-10-08 11:20:35 +08:00
    利用 lint 工具做代码规范检查
    利用 mypy 做静态类型检查
    利用 radon 做圈复杂度等检查
    学会捕获和处理异常
    关键步骤打 log
    lookStupiToForce
        18
    lookStupiToForce  
       2022-10-08 11:20:43 +08:00
    pycharm debug mode
    打断点或者勾选运行时报错自动中断进入调试都可以,保留你报错时的原发多层环境,方便调试和溯源
    stein42
        19
    stein42  
       2022-10-08 11:24:11 +08:00
    用 pycharm 可以实时提示语法错误,再加上类型标注可以避免类型错误。
    单元测试可以确保一个函数得到期望的结果。
    logging 可以在运行时输出一些信息,比 print 更好用。
    JYLu
        20
    JYLu  
    OP
       2022-10-08 11:25:37 +08:00
    @TimePPT 专业!谢谢。
    arischow
        21
    arischow  
       2022-10-08 11:30:04 +08:00 via iPhone
    @JYLu 单元测试或者 PyCharm debug mode
    clino
        22
    clino  
       2022-10-08 11:37:38 +08:00
    说“py 没有编译”是错的,python 是编译成字节码以后运行的。

    建议多写 test case 利于做回归测试,多加 assert 来针对边界情况进行低成本地预防。
    wuwuta170
        24
    wuwuta170  
       2022-10-08 12:12:09 +08:00
    print 大法好 如果 是服务类型的调试 就 logging 大法,
    wuwuta170
        25
    wuwuta170  
       2022-10-08 12:12:35 +08:00
    90%的 bug 都能通过 print 大法和 Logging 大法搞定
    fakepoet
        26
    fakepoet  
       2022-10-08 12:50:36 +08:00
    看到“代码质量就不高”这句,联想到了之前项目中做的一些“临时逻辑”,写的时候不注重抽象和便于测试,最后带来了很多隐藏 bug 。debug 的具体手段我觉得不太重要,print 和 logging 就够用了,建议把代码组织好,整洁一些,方便阅读也方便测试和 debug 。
    dantangfan
        27
    dantangfan  
       2022-10-08 13:43:21 +08:00
    @yuelang85 没问题的,本来就是一直内部使用的线上诊断工具开源出来的。
    fzls
        28
    fzls  
       2022-10-08 16:20:39 +08:00
    @JYLu 用上一些 lint 库,可以避免很多容易出现的问题
    mogging
        30
    mogging  
       2022-10-08 17:29:31 +08:00
    @yuelang85 vscode ssh + pylance 两个插件在 Linux 服务器上做开发调试丝般顺滑
    JYLu
        31
    JYLu  
    OP
       2022-10-08 18:24:14 +08:00 via Android
    @fzls, 谢谢.
    收藏了.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5897 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 02:15 · PVG 10:15 · LAX 19:15 · JFK 22:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.