跳转到主要内容

flake8插件,用于检查对`sys.version`或`sys.version_info`的误用

项目描述

build status pre-commit.ci status

flake8-2020

flake8插件,用于检查对sys.versionsys.version_info的误用

当存在python3.10python4.0时(预计在2020年左右),这将成为一个问题。

您可能还会发现python3.10的早期构建很有用

安装

pip install flake8-2020

flake8代码

代码 描述
YTT101 sys.version[:3]被引用(python3.10)
YTT102 sys.version[2]被引用(python3.10)
YTT103 sys.version与字符串比较(python3.10)
YTT201 sys.version_info[0] == 3被引用(python4)
YTT202 six.PY3被引用(python4)
YTT203 sys.version_info[1]与整数比较(python4)
YTT204 sys.version_info.minor与整数比较(python4)
YTT301 sys.version[0]被引用(python10)
YTT302 sys.version与字符串比较(python10)
YTT303 sys.version[:1]被引用(python10)

理由

许多代码错误地引用了sys.versionsys.version_info成员。特别是,在Python 3.9之后的版本发布时,这可能会引起一些问题。我的当前建议是3.10,因为我相信它对代码的破坏较少,以下是一些会导致问题的模式

# in python3.10 this will report as '3.1' (should be '3.10')
python_version = sys.version[:3]  # YTT101
# in python3.10 this will report as '1' (should be '10')
py_minor = sys.version[2]
# in python3.10 this will be False (which goes against developer intention)
sys.version >= '3.5'  # YTT103


# correct way to do this
python_version = '{}.{}'.format(*sys.version_info)
py_minor = str(sys.version_info[1])
sys.version_info >= (3, 5)
# in python4 this will report as `False` (and suddenly run python2 code!)
is_py3 = sys.version_info[0] == 3  # YTT201

# in python4 this will report as `False` (six violates YTT201!)
if six.PY3:  # YTT202
    print('python3!')

if sys.version_info[0] >= 3 and sys.version_info[1] >= 5:  # YTT203
    print('py35+')

if sys.version_info.major >= 3 and sys.version_info.minor >= 6:  # YTT204
    print('py36+')

# correct way to do this
is_py3 = sys.version_info >= (3,)

if not six.PY2:
    print('python3!')

if sys.version_info >= (3, 5):
    print('py35+')

if sys.version_info >= (3, 6):
    print('py36+')
# in python10 this will report as '1'
python_major_version = sys.version[0]  # YTT301
# in python10 this will be False
if sys.version >= '3':  # YTT302
    print('python3!')
# in python10 this will be False
if sys.version[:1] >= '3':  # YTT303
    print('python3!')


# correct way to do this
python_major_version = str(sys.version_info[0])

if sys.version_info >= (3,):
    print('python3!')

if sys.version_info >= (3,):
    print('python3!')

作为pre-commit钩子

有关说明,请参阅pre-commit

示例.pre-commit-config.yaml

-   repo: https://github.com/pycqa/flake8
    rev: 3.7.8
    hooks:
    -   id: flake8
        additional_dependencies: [flake8-2020==1.6.1]

由以下支持