编程语言高质量代码的优秀Python工具

    作者:Andrew Scott更新于: 2020-03-23 21:20:54

    大神带你学编程,欢迎选课

    5款开发安全、高质量代码的优秀Python工具。高级语言的出现使得计算机程序设计语言不再过度地依赖某种特定的机器或环境。这是因为高级语言在不同的平台上会被编译成不同的机器语言,而不是直接被机器执行。最早出现的编程语言之一FORTRAN的一个主要目标,就是实现平台独立。

    怎样提高代码的质量、安全性和可维护性,本文作者推荐了五款工具,并从四个方面对其进行量化。并且,他还介绍了怎样将这些工具整进 CI pipeline。

    【金融特辑】光大银行科技部DBA女神带你从0到1揭秘MGR

    编程语言高质量代码的优秀Python工具_编程语言_Python_计算机_课课家高代码的质量、安全性和可维护性,本文作者推荐了五款工具,并从四个方面对其进行量化。并且,他还介绍了怎样将这些工具整进 CI pipeline。

    为提高代码的质量、安全性和可维护性,软件工程师每天会用到无数工具。本篇文章,我列出了一些自己最喜欢的 python 工具,并从易用性(是否易于安装、运行和自动化)、质量影响(能否阻止可预见的 bug)、可维护性影响(是否让工作更轻松)和安全性影响(能否发现并阻止安全性问题)对它们进行打分,以供读者参考。

    并且,我还将介绍如何将这些工具全包含进 CI pipeline,从而实现自动化和高效。

    1. Pipenv

    它是为 Python 设计的开发管理和依赖管理的工具,最早由 Requests 的作者 Kenneth Reitz 编写。

    如果你用 python 做过一段时间的开发,那么管理环境,你可能用过 virtualenv 或 venv;依赖管理可能用过较可靠的pip freeze > requirements.txt。

    https://virtualenv.pypa.io/en/latest/

    https://docs.python.org/3/library/venv.html

    大多数情况下,这完全没问题。但是,我发现 pipenv 更方便,且很强大,加上它通过Pipfile和Pipfile.lock近乎去掉固定依赖的做法,很大程度上替代了requirements.txt,从而带来更可靠的部署。

    不过,我对 pipenv 的未来有点担忧,因为 Python 基金会已搁置对 pip 的改进。而且,pipenv 在 2019 年缺乏实质性进展。但是,我仍然认为,对大多数 python 用户来说,pipenv 是绝佳的工具。

    官网:https://pipenv.kennethreitz.org/en/latest/

    月下载量:2111976

    备选方案:poetry、virtualenv、venv

    2. Ochrona

    这里,我有点私心,因为 Ochrona 是我积极开发并希望 2020 年发布的工具。不过,我还会介绍这个工具的替代方案。

    Ochrona 是一款依赖分析和软件组成分析的工具,它可以用来检查你的开源依赖是否存在已知漏洞。这个领域,另一款很流行的开源工具是 pyup.io 的 Safety。

    https://pyup.io/safety/

    我认为,Ochrona 比 Safety 更好的地方在于:

    无论是用于开源项目还是商业项目,它都提供免费方案,而且免费方案始终跟进最新的漏洞信息。

    磁盘和 IO 使用非常少。不同于需要拉取整个漏洞数据库的本地工具,它是 SaaS 模式,只需调用一次公开的 API。

    它提供优秀的漏洞数据并且每天更新,并比其他工具提供更多的漏洞详细信息,包括免费用户。

    官网:https://ochrona.dev/

    月下载量:尚未发布

    备选方案:safety、snyk (收费)

    3. Bandit

    如果必须推荐一个可提高 python 项目安全性的工具,那我推荐 Bandit 。

    https://bandit.readthedocs.io/en/latest/

    据悉,Bandit 出自 OpenStack,但现在由 PyCQA 维护。它是一款开源的 SAST(静态应用安全测试)工具,免费、可配置且快速。从某些方面来讲,它就像是关注安全领域的 linter。

    Bandit 很适合用来发现问题,比如不安全的配置、已知的不安全模块使用情况等。

    官网:https://github.com/PyCQA/bandit

    月下载量:575101

    备选方案:pyre、pyt、dodgy

    4. Black

    Black 是一款独特的代码格式化工具。它能自动将你的代码更正为 Black 样式(一个 Pep-8 的超集)。

    传统的 linter 通常需要你把代码改为合规代码,而 Black 可以节省不少时间。并且,Black 只需有限的配置,这意味着你如果用过 Black,其他任何项目你都会觉得眼熟。

    官网:https://github.com/psf/black

    月下载量:1891711

    备选方案:flake8、pylint

    5. Mypy

    它是 python 一个可选的静态类型检查器。PEP 484 引入 python 的类型提示,Mypy 则利用这些类型提示对项目进行静态类型检查。

    Python 依然有动态的 duck 类型,不过,添加静态类型检查能帮你减少测试和调试时间,更早发现错误。

    目前,大公司也在跟进 python 的静态类型检查。在 Guido van Rossum 任职期间,Dropbox 用 Mypy 检查了 400 多万行代码。其他的 python 用户,比如 Instagram 也开始做静态类型检查。

    官网:http://mypy-lang.org/

    月下载量:2487228

    备选方案:pyre

    https://pyre-check.org/

    6. 全部集成到一起

    这个例子种,我会用到 Travis-CI,配置其他 CI 工具的过程与之类似相似,只是语法上会有差异。这里,我用一个简单、不安全且有问题的 flask 应用作为例子。

    https://travis-ci.com/

    app.py文件如下:

    1. from flask import Flask 
    2.  
    3. app = Flask(__name__) 
    4.  
    5. @app.route('/'
    6. def hello_world(name: str) -> str: 
    7.     return hello_name(name) 
    8. def hello_name(name: str) -> int
    9.     return f"hello, {name}" 
    10.  
    11. if __name__ == '__main__'
    12.     app.run(debug=True) 

    Pipfile如下:

    1. [[source]] 
    2. name = "pypi" 
    3. url = "https://pypi.org/simple" 
    4. verify_ssl = true 
    5.  
    6. [dev-packages] 
    7. bandit = "*" 
    8. v = {editable = true,version = "*"
    9. black = "*" 
    10. mypy = "*" 
    11. ochrona = "*" 
    12.  
    13. [packages] 
    14. flask = "==0.12.2" 
    15.  
    16. [requires] 
    17. python_version = "3.7" 

    最后在根目录下创建一个.travis.yml文件,内容如下:

    1. language: python 
    2. python: 
    3.   - 3.7 
    4. install: 
    5.   - pip install -U pip 
    6.   - pip install pipenv 
    7.   - pipenv install --dev 
    8. script: 
    9.   - bandit ./* 
    10.   - black --check . 
    11.   - ochrona 
    12.   - mypy . 

    如果查看这里的构建,你会发现每个工具都标出错误或指出需修改的地方。

    https://travis-ci.com/beatsbears/vulnerable_flask/builds/149315498

    那么,我们来做一些修正,如这个 PR 所示,构建就可以通过。

    https://github.com/beatsbears/vulnerable_flask/pull/2

    将 Flask 升级到一个没有已知漏洞的版本

    修复类型注释,禁用调试模式,规范格式

    虽然这个例子只涉及一个 CI 平台,但其实和集成到其他大多数平台的方法都很相似。

    下面是一个总的评分表:

    在过去的几十年间,大量的编程语言被发明、被取代、被修改或组合在一起。尽管人们多次试图创造一种通用的程序设计语言,却没有一次尝试是成功的。之所以有那么多种不同的编程语言存在的原因是,编写程序的初衷其实也各不相同;新手与老手之间技术的差距非常大,而且有许多语言对新手来说太难学;还有,不同程序之间的运行成本(runtime cost)各不相同。

课课家教育

未登录