2009-04-29 3 views
47

Есть ли что-то похожее на Pylint, которое будет смотреть на скрипт Python (или запустить его) и определить, какую версию Python требуется для каждой строки (или функции)?Инструмент для определения того, какая минимальная версия Python требуется?

Например, теоретический расход:

$ 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 

ли такое возможно? Я предполагаю, что самым простым способом было бы иметь все версии Python на диске, запустить сценарий с каждым и посмотреть, какие ошибки возникают.

+3

+1 Это отличный вопрос. В последнее время я искал что-то подобное. – Zifre

+0

Это, безусловно, возможно. Однако, скорее всего, он еще не реализован. – lothar

+4

Отличный вопрос. Запуск большого проекта в последовательной версии Python не был бы очень окончательным, если бы у вас не было, скажем, модульных тестов, которые волшебным образом обеспечивали покрытие на 100% кода, поэтому было бы неплохо иметь такой инструмент. –

ответ

42

Вдохновленный этим замечательным вопросом, я недавно собрал сценарий, который пытается это сделать. Вы можете найти его на github по адресу pyqver.

Это достаточно полно, но есть некоторые аспекты, которые еще не обработаны (как указано в файле README). Не стесняйтесь развивать и улучшать его!

8

Не настоящий полезный ответ, но здесь он все равно идет. Я думаю, что это должно быть выполнимо, чтобы сделать (хотя, вероятно, вполне упражнение), например, вы можете убедиться, что у вас есть все официальные грамматики для версий, которые вы хотите проверить, например this one.

Затем проанализируйте бит кода, начиная с первой версии грамматики. Далее вам понадобится похожая карта всех встроенных пространств имен модулей и снова проанализируйте код, начиная с самой ранней версии, хотя может быть сложно различать встроенные модули и модули, которые являются внешними или что-то среднее между ElementTree.

В результате должен быть обзор версий, поддерживающих синтаксис кода и обзор модулей, и какая версия (если вообще требуется) необходима для ее использования. С этим результатом вы можете рассчитать наилучшую самую низкую и самую высокую версию.

+1

+1 Для колледжа попробуйте выполнить подобную задачу, и для своих замечаний о трудностях с этим, используя пример ElementTree. Этот вопрос в значительной степени намекает на статический анализ, чего очень трудно достичь для динамических языков, как вы указываете. При случайном использовании Python «из __future__ import blah» это становится еще сложнее. А затем бросьте утку, набирая :-) Твой хороший ответ, который вводит всех этих червей в банку. –

+0

Посмотрите на мой новый ответ на этот вопрос, я собрал сценарий, который пытается определить минимальную версию Python. –

Смежные вопросы