astral-sh / ruff

An extremely fast Python linter and code formatter, written in Rust.
https://docs.astral.sh/ruff
MIT License
33.21k stars 1.11k forks source link

UP036 should identify sys.version_info[0] or other parts #12993

Closed inoa-jboliveira closed 3 months ago

inoa-jboliveira commented 3 months ago

I found there was some leftover py2k code in a project that UP rules would not catch because it just matches sys.version_info as a tuple. If you just check for the 1st element, which is kinda common in the old days, it will not show an error.

import sys

if sys.version_info[0] < 3:
    print('old')

if sys.version_info < (3, 0):
    print('also old')

UP036

$ ruff check --isolated --select UP036 foo.py
foo.py:6:4: UP036 Version block is outdated for minimum Python version
  |
4 |     print('old')
5 |
6 | if sys.version_info < (3, 0):
  |    ^^^^^^^^^^^^^^^^^^^^^^^^^ UP036
7 |     print('also old')
  |
  = help: Remove outdated version block

Found 1 error.
No fixes available (1 hidden fix can be enabled with the `--unsafe-fixes` option).

It would be helpful if both options were found. I believe this is only relevant for python 2 since python 4 is no longer going to exist, but python 3 will be the forever version with the 2nd number being the de facto python version.

If so, this rule could also catch these cases.

if sys.version_info[1] < 12: ...

In time: Ruff 0.6.1

dhruvmanila commented 3 months ago

I think checking against sys.version_info[0] seems reasonable, not sure about sys.version_info[1]. What do you think @AlexWaygood ?

inoa-jboliveira commented 3 months ago

I think sys.version_info[1] would only be relevant when PEP 2026 gets accepted, which makes the number "3" useless.

Also ruff only runs in Python 3 code.

I imagine in a few years people saying: "this thing runs only on python 28 or 29" instead of 3.28 and 3.29

For a litmus test, you can check how often this is used on github repos. There several usages together with [0] and also by itself.

https://github.com/search?q=sys.version_info%5B1%5D+language%3Apython&type=code

MichaReiser commented 3 months ago

I would prefer waiting with sys.version_info[1] until a PEP makes python 3 officially the final major version.

inoa-jboliveira commented 2 months ago

Cool, thank you!