阅读 959

mypy + flake8 + black + isort神兵利器助你的Python代码更加优雅 | Python 主题月

本文正在参加「Python主题月」,详情查看 活动链接

微信公众号搜索【程序媛小庄】,Rest cannot be enjoyed by lazy people~

前言

Python的代码需要遵循PEP8规范,否则~当然不会报错,只是会出现很讨厌的波浪线,如下图所示:

image-20210721145844099

这么几行代码就出现了三处波浪线,不规范的地方有以下几个:

①导入了time模块却没有使用;

import语句与正式的逻辑代码之间需要空两行;

③函数的参数当有多个时,每个参数之间应该空一个空格;

④函数代码结束之后,应该换行。

image-20210721150410960

这只是部分PEP8规范,有一些工具可以帮助我们自动将代码格式化为符合PEP8规范的代码,和波浪线说拜拜哦,下面就来简单介绍一下mypy flake8 black isort这四个工具。

mypy

这里介绍mypy的简单使用,更多的关于mypy模块的使用请参考*mypy官方文档*。

mypy的作用

mypy是一款针对python的静态类型检查程序,我们知道python是一门动态类型的语言,既然是动态类型的语言,python的类型检查还有啥意义呢?静态类型语言在程序运行之前通过对源代码的分析进行类型检查,并在运行前检测应用程序中代码可能的错误,就是mypy(python应用程序的静态类型检查)的价值所在。上述文字来源于*Fedora中文组*

mypy的安装和运行

mypy的安装非常简单:pip install mypy。使用mypy前还需要安装另一个模块typing,该模块的作用就是用来进行类型检查,mypy在进行类型检查时需要借助typing模块。

下面使用简单的代码测试和理解mypy的作用:

class People:
    def __init__(self, name, age):
        self.name = name
        self.age = age


def info(peoples_list):
    for people in peoples_list:
        if people.age < 18:
            print(f'{people.name}是小孩子')


p1 = People('python', 10)
p2 = People('java', 20)

info([p1, p2])
info(p1)
复制代码

将这段代码保存到test.py中,使用mypy对上述代码进行检查:

mypy test.py
# Success: no issues found in 1 source file
复制代码

默认情况下mypy不会提醒代码任何错误,如果使用的是Python3.6及以上版本,可以使用typing模块为代码进行类型标注,然后mypy就可以根据这些类型提示检查应用程序,比如给info函数添加类型提示:

from typing import List

def info(peoples_list: List[People]) -> None:
    for people in peoples_list:
        if people.age < 18:
            print(f'{people.name}是小孩子')
复制代码

peoples_list: List[People]表示info函数的参数必须是列表套People对象。

->None表示info函数返回值为None。

现在再次运行mypy,则会得到下面的结果:

mypy test.py
# test.py:20: error: Argument 1 to "info" has incompatible type "People"; expected "List[People]"
复制代码

mypy经常会生成一些找不到库或者包的错误,或者某些错误不想提示的话,可以在代码后加注释:

info(p1)  # type: ignore
复制代码

除了直接使用命令和注释的方式使用mypy之外,mypy也支持从文件中读取配置,mypy的配置文件默认使用.mypy.ini文件,配置文件通常是ini文件。在mypy的配置文件中有两种配置,一种是全局配置,全局配置是必须要有的,另一种局部配置,如果全局配置和局部配置出现冲突则以局部配置为准:

# .mypy.ini

# 全局配置
[mypy]
ignore_missing_imports=true

# 局部配置, test项目下的migrations目录下的所有文件报错全部忽略
[mypy-test.migrations.*]
ignore_errors = True
复制代码

更多配置文件选项请参考*官方文档*,使用配置文件启动mypy:

mypy --config-file /usr/local/config/.mypy.ini test.py
复制代码

flake8

这里简单介绍flake8的使用,更多请参考*官方文档*.

flake8的作用

flake8是Python官方发布的一款辅助检测Python代码是否符合规范的工具,这样的工具还有时下热门的Pylint,这里只介绍flake8的简单使用。flake8是下面三个工具的封装:

PyFlakes
Pep8
NedBatchelder’s McCabe script
复制代码

flake8的安装和运行

flake8的安装也是非常简单:pip install flake8flake8必须运行在Python3.5版本及以上的解释器中。

可以使用flake8检查某一个文件是否符合规范也可以检查某一个目录下所有的文件是否符合规范。

# 检查某一个文件
flake8 /usr/local/test.py  # test.py:20:26: W292 no newline at end of file

# 检查某一个目录下的所有文件
flake8 /usr/local/code/
'''
/usr/local/code/test.py:71:14: W292 no newline at end of file
/usr/local/code/test1.py:15:80: E501 line too long (97 > 79 characters)
/usr/local/code/test2.py:37:7: F821 undefined name 'l1'

'''
复制代码

如果只想检查某一种或几种特定错误或者只想忽略某种错误,可以使用下述方式,错误代码请*参考官方文档*:

flake8 --select E123,W503 path/to/code/  # 检查特定的错误
flake8 --ignore E24,W504 path/to/code/   # 忽略特定的错误
复制代码

除了简单的使用flake8之外,也可以通过flake8的配置文件控制flake8,配置文件通常命名为setup.cfg或者tox.ini或者.flake,不过flake8官方推荐配置文件使用ini格式,配置文件的选项详见*flake8选项完整列表* ,下面是简单的配置文件的格式:

# tox.ini
[flake8]
# 注释:忽略的错误W292
ignore = W292

# 检查以xx开头的错误
select = B,C,E,F,W,T4,B9

# 不检查的文件或者目录
exclude = .git,__pycache__,docs/source/conf.py,old,build,dist
复制代码

使用配置文件启动flake8检查代码:

flake8 --config=/usr/local/tox.ini /usr/local/code/
复制代码

black

black是Python官方退出的用来检查代码是否符合PEP8规范的工具,可以格式化整个文件,使用方式相对mypyflake8简单一些。

首先是black的安装:pip install black,运行方式也非常简单,可以格式化指定文件或者指定目录下的所有文件。

# 格式化目录下的文件
black /usr/local/code/

# 格式化指定文件
black /usr/local/test.py
复制代码

执行后的效果如下:

# black执行之前
l = [
    1,
    2
]

dic = {
    'name':'python', 'age':10
}

# black执行之后
l = [1, 2]

dic = {"name": "python", "age": 10}
复制代码

isort

isort工具可以自动对Python的import语句进行排序和分段,可将大量的import结构格式化成非常适合阅读的排版。

isort的安装也非常简单pip install isortisort的使用既可以在特定文件上运行也可以应用目录上。

isort /usr/local/test.py  # 指定文件
isort /usr/local/  # 指定目录下的所有文件
isort /usr/local/*.py  # 目录下的所有py文件
复制代码

如果只想看格式化之后的结果和当前有什么不同又不想应用格式化之后的结果,可以使用--diff

isort test.py --diff
复制代码

如果想要忽略某一行的导入,只需要在该行代码末尾添加注释:isort:skip

import module  # isort: skip
复制代码

另外也可在Python中使用代码进行格式化:

import isort

isort.file("pythonfile.py")
复制代码

isort有一个非常好用的功能,就是可以集成到git,在将代码提交到git之前进行代码检查,具体使用参考官方文档

同时isort支持各种标准配置格式,允许将自定义的配置快速集成到项目中,可以通过--setiings-path从命令行设置手动指定配置we年的路径,否则isort会遍历非常多的目录去寻找合适的配置文件。isort首选的配置文件格式是.isort.cfgisort查找配置的第一个位置就是.isort.cfg,还有一一些其他的配置文件也请参考官方文档,通常使用首选配置文件即可。下面是isort配置文件示例,更多关于isort配置的选项参考*文档*:

# .isort.cfg
[settings]  # 通用配置
profile=hug
src_paths=isort,test
复制代码

总结

在项目开发中,合理使用这些工具能让你的代码更加漂亮和优美哦!

结语

文章首发于微信公众号程序媛小庄,同步于掘金

码字不易,转载请说明出处,走过路过的小伙伴们伸出可爱的小指头点个赞再走吧(╹▽╹)

文章分类
后端
文章标签