flake8 plugin which checks for misuse of `sys.version` or `sys.version_info`
Project Links
Meta
Author: Anthony Sottile
Requires Python: >=3.8
Classifiers
License
- OSI Approved :: MIT License
Programming Language
- Python :: 3
- Python :: 3 :: Only
- Python :: Implementation :: CPython
flake8-2020
flake8 plugin which checks for misuse of sys.version or sys.version_info
this will become a problem when python3.10 or python4.0 exists (presumably
during the year 2020).
you might also find an early build of python3.10 useful
installation
pip install flake8-2020
flake8 codes
| Code | Description |
|---|---|
| YTT101 | sys.version[:3] referenced (python3.10) |
| YTT102 | sys.version[2] referenced (python3.10) |
| YTT103 | sys.version compared to string (python3.10) |
| YTT201 | sys.version_info[0] == 3 referenced (python4) |
| YTT202 | six.PY3 referenced (python4) |
| YTT203 | sys.version_info[1] compared to integer (python4) |
| YTT204 | sys.version_info.minor compared to integer (python4) |
| YTT301 | sys.version[0] referenced (python10) |
| YTT302 | sys.version compared to string (python10) |
| YTT303 | sys.version[:1] referenced (python10) |
rationale
lots of code incorrectly references the sys.version and sys.version_info
members. in particular, this will cause some issues when the version of python
after python3.9 is released. my current recommendation is 3.10 since I believe
it breaks less code, here's a few patterns that will cause issues:
# 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!')
as a pre-commit hook
See pre-commit for instructions
Sample .pre-commit-config.yaml:
- repo: https://github.com/pycqa/flake8
rev: 3.7.8
hooks:
- id: flake8
additional_dependencies: [flake8-2020==1.6.1]
1.8.1
Jun 10, 2023
1.8.0
May 06, 2023
1.7.0
Aug 01, 2022
1.6.1
Nov 30, 2021
1.6.0
Feb 24, 2020
1.5.0
Nov 04, 2019
1.4.0
Oct 17, 2019
1.3.0
Aug 30, 2019
1.2.1
Aug 29, 2019
1.2.0
Aug 29, 2019
1.1.0
Aug 27, 2019
1.0.0
Aug 24, 2019
Wheel compatibility matrix
Files in release
Extras:
None
Dependencies:
flake8
(>=5)