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

[文章] 编写高质量 Python 的 6 个技巧

  •  
  •   Zkiller · 2018-09-22 10:40:29 +08:00 · 1565 次点击
    这是一个创建于 2253 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用 decimal 进行高精度计算

    Python 内置了 decimal 模块,主要解决日常精度,默认提供了 28 个小数位进行数学计算。

    decimal 中 Decimal 类解决了 IEEE 754 浮点数产生的精度问题,并且可以进行更为准确舍入行为。

    所以我们在涉及重要场合比如货币金额计算情况,非常合适。

    当然我们也可以进行把小数转化为整数计算,只是会更麻烦一些,不够灵活应对。


    不要返回 None

    遇到特殊情况是,应该抛出异常,而不是返回 None,比如除法分子为 0 的情况,当调用者看到异常就知道如何修正代码。

    举一个错误的例子

    
    def divide(a, b):
        try:
            return a/b
        except ZeroDivisonError
            return None
    

    返回 None 的话,由于我们有空字符串,0,空字典,空列表等都表示 False,容易误导我们写出错误的代码。

    另外就算我们意识到这个问题,我们代码中也会充斥许多检查 None 值的判断语句,变相增加了我们工作量


    传递可变参数,默认值用 None

    紧接上一条,在传递可变参数我们参数应该使用 None,因为函数的默认值,只会在程序加载模块并读到本函数的定义时进行评估。

    如果默认值用空字典,空列表,往往会导致前后共用一个默认值,发生奇怪行为。

    我们可以使用 None 作为形式上的默认值,在中途重新赋值,改变这种行为。


    使用推导式替换 map 和 filter

    通过列表、字典推导可以让我们代码看起来更为简单明了,比如下面例子:

    a = [1,2,3,4,5,6] b = [x**2 for x in a if x % 2 == 0]

    把 filter 函数和 map 结合起来也能做到,但是代码变得更为复杂难懂 c = map(lambda x: x**2, filter(lambda x: x%2 == 0, a))

    上面一对比一下就知道那个更容易理解了,列表推导虽好,但不建议多个列表推导式,虽然最终看起来节约了代码,但是给人难以理解,增加理解成本。

    毕竟代码是给人看的,只是顺带给机器执行一下而已。:)


    使用 ipdb 进行调试

    调试过程中,虽然有 print,logger,单元测试帮助我们查找问题原因,但是面对更为复杂的问题调试,往往需要更强大的调试工具进行交互操作,打印局部变量,程序状态,查看上下文,单步调试等等。

    ipdb 是 pdb 的升级版,非常灵活支持代码变量输入补全,非常方便,类似 ipython 和 python 的功能对比,推荐大家去使用使用。


    使用环境变量

    经常看到一些新手开发的时候,在进行环境参数配置导入导出的时候喜欢用层层叠加的方式覆盖,每次开发过程把配置文件名 pro_config.py 改为 pro_config.py.bak 来进行环境变量控制等等。

    
    try:
        from local_config import *
        from dev_config import *
        from pro_config import *
    except:
        pass
    
    

    Python 有对应的包 importlib,结合 os 模块,我们可以通过 export 进行环境变量的控制, 配合 docker-compose 类似工具,启动不同环境容器就能进行隔离开发非常方便。

    
    import importlib
    import os
    config_file = os.getenv('XXX_API_SETTINGS')
    if not config_file:
        config_file = 'XXX.config.test'
    config_module = importlib.import_module(config_file)
    
    

    上面的几个技巧,是我常用的一些方法技巧,起于 Python,不止 Python,欢迎大家在留言区留下你的方式方法,我们一起讨论。

    另外在上一篇文章我分享了提高代码质量,这本书就够了,这里面有赠送「代码整洁之道」这本书的活动,今天的技巧就有来自该书,感兴趣的同学可以去文章下面留言参与。

    相关文章:

    提高代码质量,这本书就够了

    Python 新手常见的几个问题及工具推荐

    本文首发 微信公众号 当程序员以后,programmer100 欢迎订阅

    3 条回复    2018-09-23 09:31:59 +08:00
    20015jjw
        2
    20015jjw  
       2018-09-22 23:23:43 +08:00 via Android   ❤️ 1
    @livid 推广
    Zkiller
        3
    Zkiller  
    OP
       2018-09-23 09:31:59 +08:00
    @20015jjw #2 感谢,移动过来了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5202 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 05:50 · PVG 13:50 · LAX 21:50 · JFK 00:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.