2009-04-29 12 views
47

Czy jest coś podobnego do Pylinta, które będzie przeglądać skrypt w języku Python (lub uruchamiać go) i określić, której wersji Pythona każda linia (lub funkcja) wymaga?Narzędzie do określenia wymaganej wersji językowej Pythona?

Na przykład, teoretyczne zużycie:

$ 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 

Czy coś takiego jest możliwe? Przypuszczam, że najprostszą metodą byłoby posiadanie wszystkich wersji Pythona na dysku, uruchomienie skryptu z każdym z nich i zobaczenie, jakie błędy występują.

+3

+1 To jest świetne pytanie. Ostatnio czegoś takiego szukałem. – Zifre

+0

Jest to z pewnością możliwe. Jest jednak prawdopodobne, że nie został jeszcze wdrożony. – lothar

+4

Doskonałe pytanie. Uruchomienie dużego projektu w kolejnej wersji Pythona nie byłoby zbyt definitywne, chyba że miałoby miejsce, powiedzmy, testy jednostkowe, które magicznie osiągnęły 100% pokrycia kodu, więc takie narzędzie byłoby miło mieć. –

Odpowiedz

42

Zainspirowany tym wspaniałym pytaniem, ostatnio skomponowałem skrypt, który próbuje to zrobić. Możesz go znaleźć na github pod numerem pyqver.

Jest w miarę kompletny, ale istnieją pewne aspekty, które nie są jeszcze obsługiwane (jak wspomniano w pliku README). Zapraszamy do rozwidlenia i poprawy!

8

Nie jest to prawdziwa przydatna odpowiedź, ale tutaj i tak to idzie. Myślę, że powinno to być możliwe do zrobienia (chociaż prawdopodobnie jest to całkiem ćwiczenie), na przykład możesz mieć pewność, że masz wszystkie oficjalne gramatyki dla wersji, które chcesz sprawdzić, np. this one.

Następnie przeanalizuj fragment kodu, zaczynając od pierwszej wersji gramatycznej. Następnie potrzebna jest podobna mapa wszystkich wbudowanych przestrzeni nazw modułów i ponownie przeanalizować kod, zaczynając od najwcześniejszej wersji, chociaż może być trudno wyodrębnić wbudowane moduły i moduły, które są zewnętrzne lub znajdują się między nimi, podobnie jak ElementTree.

Wynik powinien być przeglądem wersji obsługujących składnię kodu i przegląd modułów oraz wersji (jeśli w ogóle) potrzebnej do jej użycia. Dzięki temu wynikowi możesz obliczyć najlepszą najniższą i najwyższą wersję.

+1

+1 Dla uczelni spróbuj wykonać takie zadanie, a także uwagi na temat trudności w wykonaniu tego na przykładzie ElementTree. To pytanie w dużym stopniu wskazuje na analizę statyczną, co jest bardzo trudne do osiągnięcia w przypadku dynamicznych języków, o czym wspominasz. Przy sporadycznym używaniu przez Pythona "z __future__ import blah" staje się jeszcze trudniejsze. A potem rzuć kaczkę :-) Twoja jest dobrą odpowiedzią, która wprowadza wszystkie te robaki w puszce. –

+0

Spójrz na moją nową odpowiedź na to pytanie, przygotowałem skrypt, który próbuje zidentyfikować wymaganą minimalną wersję Pythona. –

Powiązane problemy