Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/asottile-archive/flake8-2020
flake8 plugin which checks for misuse of `sys.version` or `sys.version_info`
https://github.com/asottile-archive/flake8-2020
flake8
Last synced: about 2 months ago
JSON representation
flake8 plugin which checks for misuse of `sys.version` or `sys.version_info`
- Host: GitHub
- URL: https://github.com/asottile-archive/flake8-2020
- Owner: asottile-archive
- License: mit
- Archived: true
- Created: 2019-08-24T23:42:04.000Z (almost 5 years ago)
- Default Branch: main
- Last Pushed: 2024-02-04T18:57:42.000Z (5 months ago)
- Last Synced: 2024-05-08T04:08:51.243Z (about 2 months ago)
- Topics: flake8
- Language: Python
- Size: 179 KB
- Stars: 63
- Watchers: 4
- Forks: 6
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Lists
- awesome-flake8-extensions - flake8-2020 - Plugin which checks for misuse of `sys.version` or `sys.version_info`. (Bugs)
- my-awesome-stars - asottile-archive/flake8-2020 - flake8 plugin which checks for misuse of `sys.version` or `sys.version_info` (Python)
README
# ARCHIVED
3.10 is old news now and I don't plan on updating it further
___
[![build status](https://github.com/asottile/flake8-2020/actions/workflows/main.yml/badge.svg)](https://github.com/asottile/flake8-2020/actions/workflows/main.yml)
[![pre-commit.ci status](https://results.pre-commit.ci/badge/github/asottile/flake8-2020/main.svg)](https://results.pre-commit.ci/latest/github/asottile/flake8-2020/main)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
[python3.10]: https://github.com/asottile/python3.10
## installation
```bash
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:```python
# 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)
``````python
# 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+')
``````python
# 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](https://github.com/pre-commit/pre-commit) for instructions
Sample `.pre-commit-config.yaml`:
```yaml
- repo: https://github.com/pycqa/flake8
rev: 3.7.8
hooks:
- id: flake8
additional_dependencies: [flake8-2020==1.6.1]
```