flake8 plugin which checks for misuse of `sys.version` or `sys.version_info`
Project description
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://gitlab.com/pycqa/flake8 rev: 3.7.8 hooks: - id: flake8 additional_dependencies: [flake8-2020==1.6.0]
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
| Filename, size | File type | Python version | Upload date | Hashes |
|---|---|---|---|---|
| Filename, size flake8_2020-1.6.0-py2.py3-none-any.whl (5.0 kB) | File type Wheel | Python version py2.py3 | Upload date | Hashes View |
| Filename, size flake8_2020-1.6.0.tar.gz (4.6 kB) | File type Source | Python version None | Upload date | Hashes View |
Hashes for flake8_2020-1.6.0-py2.py3-none-any.whl
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 | e464cef7889117e7ae7253e35fcb8272bd8ae68fc10bb3399ef85b036c092528 |
|
| MD5 | 72135ec64472e4dd8861d11a47c81ecb |
|
| BLAKE2-256 | 9ff2ba43d4c239b6194ba8e56997ed50e6104bb6fe55d8249e94dbd6b0fd1689 |