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

如何高效地调试 py 程序?

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

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