首页 > 教育学习 > 为什么 > 对于 Python 程序,有哪些技巧/经验可以让错误提早发生?

对于 Python 程序,有哪些技巧/经验可以让错误提早发生?
2012-01-19 19:54:43   来源:   点击:

    对于 Python 程序,有哪些技巧/经验可以让错误提早发生?动态语言程序的一种典型错误就是类型错误。对于语言的类型系统,有静态类型、强类型、弱类型的概念。其提早发现错误的能力是递减的:1.静态类型系统,通常不必执行程序,编辑器即可检查出类型错误,以compile time error的形式报出;2.对于强类型系统,在运行时出现类型不匹配的操作,会以运行时错误的形式抛出;3.对于弱类型系统,很可能直到到一批诡异的内容出现在你的终端/页面上之前,你永远也不知道自己的程序出现错误。Python属于2的强类型的动态语言,自然不期望具备compile time error。那么,能否有一些技巧,来让(类型)错误提早发生?比如说,让首次运行即可出错,而不比留到生产环境?

    6 个答案

    • 答案 1:

      1.不必执行程序就可以发现的一些语法错误,编辑器也能做到,比如WingIDE,vim下的插件pyflakes,还有pysmell,pylint等工具都可以进行检查2.善用pdb docs.python.org/library...,3. 写测试案例,doctest,unitest等来保证程序的正确,想要大部分错误都能及早检查到就要看你的测试的覆盖率了4. 在必要的地方使用logging,写进一个文件,并添加上时间5. 让错误及早发生,沈游侠在他的幻灯片中对错误检查和异常处理做了很漂亮的描述 https://docs.google.com/fileview...补充说明:我不太同意李天放和董诣同学对断言的应用,原因我已经回复在了董诣的评论下面,这里提出来再做一些补充。 - 断言应该用于测试和调试,用于确保一些情况永远不会发生;而易出错的地方应该用抛出异常,并且通常应该是你自己定义的异常。 - 断言也会抛出异常,但是仅仅只抛出AssertionErrors,当你需要精准的控制捕捉异常时并不是很适用。 - python以优化模式运行时会忽略断言,见docs.python.org/referenc...
    • 答案 2:

      当你每次修好一个bug时可以试着自己回答三个问题:这个bug是怎么发生的?它属于什么类型?有没有某种习惯可以让我自动避免这个类型的bug?长期这些技巧/经验还是需要自己去慢慢摸索。一些比较基本的习惯包括:1. 在适当的地方用assert确认基本条件2. 不要习惯性的做 if check - 有很多人用variable前会习惯性的写个if, 比如:if(user != null) user.doStuff但应该想清楚user在这个地方为什么有可能是null,假如没有好的理由不如删掉if,让code早一点出错3.避免写太长太复杂的function。每个function是个逻辑单位,入口和出口都是好的check point。4. 就算在强类型静态系统下工作时,也不要过于依赖compile time tool。我见过很多java“专家”,一旦离开eclipse和findbug就变得似乎完全不会写代码了。这种程序员转移到动态语言时比较麻烦。这是我的个人看法,也不一定是对的。有空可以讨论一下 :)
    • 答案 3:

      其实像python/ruby这样的动态语言不必过分关心类型。应该关注的是行为。用动态语言的时候,程序员必须在任何时候理解自己写的代码。输入什么和返回什么。如果是使用语言自身提供的API,必须先熟悉文档,了解正在使用的接口的所有返回情况。强类型语言运行时错误一般就是no method error和type error,这些都是可以通过对输入输出进行控制,和适当的对特殊情况进行检测(尤其是null值)来避免的。
    • 答案 4:

      说一个我长期实践的技巧。基本原则:输入控制。coding的时候铭记强烈不信任任何输入,假设我是一个function的作者,只要调用者给我的参数有一点点不符合我的期待,立即赏他个异常。至于赏他个什么样的异常,就还需要一个决策:1、输入错误是业务相关的,例如email的格式错了,那么会给出一个详细的自定义异常(类似EmailAddrError)并伴随详细的异常说明,由调用者自行处理。2、输入错误是业务无关的,例如“大哥,我需要的是一个list,你给我个scalar是个啥意思”,这种输入错误只在开发者之间可见,跟业务、用户完全没关系,那么一个简单的assert即可,不需要太详细的说明(浪费时间),因为这种错误很容易识别而且就是要明显的提醒调用这个function的同伴。这样做的好处是,所有的输入错误都会很快暴露(如果没预料到错误可能会发生并做了异常处理的话)。如果要改变参数约定,只要写下新的assert或者自定义异常,如此这个function被不符合新约定的调用一碰就错,很好的满足了提早暴露错误的要求。在这种实践下,assert不需要处理,就是要让它错,所以我不同意杨昆对断言的理解。补充一下,我现在不用assert了来干前面说的提醒同伴给正确的参数这种事情了,因为我写了个简单的check方法来干这事,能控制得更精细一点。
    • 答案 5:

      补充前面的就是,每个自模块完全信任上层调用的输入,自模块不用try catch而多assert,就是尽量吧逻辑错误变成运行时错误。另外python建议的duck type这要看你设计的如何了
    • 答案 6:

      test, test ,test

相关热词搜索:

上一篇:国内有哪些知名的建筑师或事务所?代表作什么?
下一篇:Linux的内核文件为何大多数都命名为vmlinuz或者以vmlinuz开头?