2009-04-29 13 views
47

Esiste qualcosa di simile a Pylint, che guarderà uno script Python (o lo eseguirà) e determinerà quale versione di Python richiede ogni riga (o funzione)?Strumento per determinare quale versione minima di Python è richiesta?

Per esempio, l'utilizzo teorico:

$ 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 

è possibile una cosa del genere? Suppongo che il modo più semplice sarebbe quella di avere tutte le versioni di Python su disco, eseguire lo script con ognuno e vedere cosa si verifica un errore ..

+3

+1 Questa è una grande domanda. Stavo cercando qualcosa di simile di recente. – Zifre

+0

È certamente possibile. È tuttavia probabile che non sia stato ancora implementato. – lothar

+4

Ottima domanda. Eseguire un progetto di grandi dimensioni in una versione successiva di Python non sarebbe molto definitivo, a meno che non aveste, per esempio, test unitari che hanno magicamente raggiunto una copertura del 100% del codice, quindi uno strumento come questo sarebbe bello avere. –

risposta

42

Ispirato da questa eccellente domanda, di recente ho creato una sceneggiatura che cerca di farlo. Puoi trovarlo su github allo pyqver.

È ragionevolmente completo ma ci sono alcuni aspetti che non sono ancora stati gestiti (come menzionato nel file README). Sentiti libero di biforcarti e miglioralo!

8

Non è una risposta utile reale, ma qui va comunque. Penso che questo dovrebbe essere fattibile per fare (anche se probabilmente un bel esercizio), per esempio potresti essere sicuro di avere tutte le grammatiche ufficiali per le versioni che vuoi controllare, come this one.

Quindi analizzare il bit di codice che inizia con la prima versione di grammatica. Quindi è necessaria una mappa simile a tutti gli spazi dei nomi dei moduli incorporati e si analizza nuovamente il codice a partire dalla prima versione, anche se potrebbe essere complicato distinguere tra moduli e moduli incorporati esterni o intermedi come ElementTree.

Il risultato dovrebbe essere una panoramica delle versioni che supportano la sintassi del codice e una panoramica dei moduli e quale versione (se del caso) è necessaria per utilizzarlo. Con questo risultato è possibile calcolare la migliore versione più bassa e più alta.

+1

+1 Per il college prova in un compito come questo, e per le tue osservazioni sulle difficoltà nel realizzare questo usando l'esempio di ElementTree. Questa domanda suggerisce molto l'analisi statica, che è molto difficile da raggiungere per le lingue dinamiche, come si sottolinea. Con l'uso occasionale di Python "from __future__ import blah", diventa ancora più difficile. E poi lanciare la digitazione anatra :-) La tua è una buona risposta che introduce tutti questi vermi nel barattolo. –

+0

Dai un'occhiata alla mia nuova risposta a questa domanda, ho messo insieme uno script che cerca di identificare la versione minima di Python richiesta. –

Problemi correlati