2009-04-29 19 views
47

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

Por ejemplo, el 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 sencilla sería tener todas las versiones de Python en el disco, ejecute la secuencia de comandos con cada uno y ver lo que se produce un error ..

+3

+1 Esta es una gran pregunta. Estaba buscando algo como esto recientemente. – Zifre

+0

Es ciertamente posible. Sin embargo, es probable que aún no se haya implementado. – lothar

+4

Excelente pregunta. Ejecutar un gran proyecto en una versión sucesiva de Python no sería muy definitivo, a menos que tuvieras, por ejemplo, pruebas unitarias que lograron mágicamente una cobertura del código del 100%, por lo que una herramienta como esta sería agradable de tener. –

Respuesta

42

Inspirado por esta excelente pregunta, hace poco armar un guión que trata de hacer esto. Puede encontrarlo en github al pyqver.

Es bastante completa, pero hay algunos aspectos que todavía no se manejan (como se menciona en el archivo README). ¡Siéntete libre de bifurcar y mejorar!

8
No

una respuesta útil real, pero aquí va de todos modos. Creo que esto debería ser factible (aunque probablemente sea un buen ejercicio), por ejemplo, puedes asegurarte de tener todas las gramáticas oficiales para las versiones que quieras verificar, como this one.

continuación, analizar el trozo de código que empieza con la primera versión de la gramática. A continuación necesita un mapa similar de todos los espacios de nombres de módulos incorporados y analizar el código nuevamente comenzando con la versión más antigua, aunque podría ser difícil diferenciar entre los módulos integrados y los módulos que son externos o algo intermedio, como ElementTree.

El resultado debería ser una visión general de las versiones que soportan la sintaxis del código y una visión general de los módulos y la versión (en su caso) que se necesita para usarlo. Con ese resultado podrías calcular la mejor versión más baja y la más alta.

+1

+1 Para la universidad, intenta en una tarea como esta, y para tus comentarios sobre las dificultades para lograr esto usando el ejemplo de ElementTree. Esta pregunta prácticamente alude al análisis estático, que es muy difícil de lograr para los lenguajes dinámicos, como usted señala. Con el uso ocasional de Python de "from __future__ import blah", se vuelve aún más difícil. Y luego agregue pato escribiendo :-) La suya es una buena respuesta que introduce todos estos gusanos en la lata. –

+0

Eche un vistazo a mi nueva respuesta a esta pregunta, elaboré un script que intenta identificar la versión mínima de Python requerida. –

Cuestiones relacionadas