¿Hay algo similar a Pylint, que analizará un script de Python (o lo ejecutará) y determinará qué versión de Python requiere cada línea (o función)?

Por ejemplo, uso teórico:

$ magic_tool <EOF
with something:
    pass
EOF
1: 'with' statement requires Python 2.6 or greater

$ magic_tool <EOF
class Something:
    @classmethod
    def blah(cls):
        pass
EOF
2: classmethod requires Python 2.2 or greater
$ magic_tool <EOF
print """Test
"""
EOF
1: Triple-quote requires Python 1.5 of later

¿Es posible tal cosa? Supongo que la forma más simple sería tener todas las versiones de Python en el disco, ejecutar el script con cada una y ver qué errores ocurren.

51
dbr 30 abr. 2009 a las 02:21

3 respuestas

La mejor respuesta

La herramienta pyqver de Greg Hewgill no se actualizó desde hace un tiempo.

vermin es una utilidad similar que muestra en modo detallado (-vvv) qué líneas son considerado en la decisión.

% pip install vermin
% vermin -vvv somescript.py
Detecting python files..
Analyzing using 8 processes..
!2, 3.6      /path/to/somescript.py
  L13: f-strings require 3.6+
  L14: f-strings require 3.6+
  L15: f-strings require 3.6+
  L16: f-strings require 3.6+
  print(expr) requires 2+ or 3+

Minimum required versions: 3.6
Incompatible versions:     2

Bonificación: con el parámetro -t=V puede definir una versión de destino V con la que desea ser compatible. Si no se cumple con este requisito de versión, el script saldrá con un código de salida 1, lo que facilita su integración en un conjunto de pruebas.

1
Samuel 22 oct. 2019 a las 09:07

No es una respuesta útil real, pero aquí va de todos modos. Creo que esto debería ser factible (aunque probablemente sea todo un ejercicio), por ejemplo, puede asegurarse de tener todas las gramáticas oficiales para las versiones que desea verificar, como este.

Luego analiza el bit de código que comienza con la primera versión gramatical. A continuación, necesita un mapa similar de todos los espacios de nombres de módulos integrados y analizar el código nuevamente comenzando con la versión más temprana, aunque puede ser difícil diferenciar entre módulos integrados y módulos que son externos o algo intermedio como ElementTree.

El resultado debe ser una descripción general de las versiones que admiten la sintaxis del código y una descripción general de los módulos y qué versión (si es que la necesita) es necesaria para usarla. Con ese resultado podría calcular la mejor versión más baja y más alta.

8
Martin P. Hellwig 30 abr. 2009 a las 00:35

Inspirado por esta excelente pregunta, recientemente armé un guión que intenta hacer esto. Puede encontrarlo en github en pyqver.

Está razonablemente completo, pero hay algunos aspectos que aún no se manejan (como se menciona en el archivo README). ¡Siéntase libre de bifurcar y mejorarlo!

41
Greg Hewgill 4 may. 2009 a las 10:55