Ну, я не большой программист на python, но я бы сказал, что ответ "ДА".
Любой динамический язык, позволяющий создавать переменную с любым именем в любое время, может использовать «строгую» прагму.
Строгие переменные (одна из опций для строгого в Perl, «использовать строгий» включает их все сразу) в Perl требует, чтобы все переменные были объявлены до их использования. Что означает, что этот код:
my $strict_is_good = 'foo';
$strict_iS_good .= 'COMPILE TIME FATAL ERROR';
Генерирует фатальную ошибку во время компиляции.
Я не знаю, как заставить Python отклонить этот код во время компиляции:
strict_is_good = 'foo';
strict_iS_good += 'RUN TIME FATAL ERROR';
Вы получите исключение во время выполнения, что strict_iS_good
не определено. Но только когда код выполняется. Если ваш тестовый комплект не имеет 100% покрытия, вы можете легко отправить эту ошибку.
Каждый раз, когда я работаю на языке, который не имеет такого поведения (например, PHP), я нервничаю. Я не идеальная машинистка. Простая, но трудно опознаваемая опечатка может привести к сбою в работе вашего кода способами, которые трудно отследить.
Итак, повторюсь, ДА Python может использовать "строгую" прагму для включения проверок времени компиляции для вещей, которые можно проверять во время компиляции. Я не могу думать о каких-либо других проверках, которые можно добавить, но, вероятно, о некоторых из них мог бы подумать лучший программист Python.
Примечание Я сосредотачиваюсь на прагматическом эффекте от stict vars в Perl и примыкаю к некоторым деталям. Если вы действительно хотите узнать все подробности, см. в perldoc для строгого .
Обновление: ответы на некоторые комментарии
Джейсон Бейкер : Статические шашки, такие как Пилинт, полезны. Но они представляют собой дополнительный шаг, который можно и часто пропускают. Встраивание некоторых базовых проверок в компилятор гарантирует, что эти проверки выполняются последовательно. Если эти проверки контролируются прагмой, даже возражение, касающееся стоимости проверок, становится спорным.
popcnt : я знаю, что python сгенерирует исключение во время выполнения. Я так и сказал. Я рекомендую проверять время компиляции, где это возможно. Пожалуйста, перечитайте пост.
mpeters : Ни один компьютерный анализ кода не может найти все ошибки - это равносильно решению проблемы остановки. Хуже того, чтобы находить опечатки в назначениях, вашему компилятору необходимо знать ваши намерения и находить места, где ваши намерения отличаются от вашего кода. Это совершенно очевидно невозможно.
Однако это не означает, что никакая проверка не должна выполняться. Если есть классы проблем, которые легко обнаружить, то имеет смысл их ловить.
Я недостаточно знаком с pylint и pychecker, чтобы сказать, какие классы ошибок они будут обнаруживать. Как я уже сказал, я очень неопытен с python.
Эти программы статического анализа полезны. Тем не менее, я считаю, что если они не дублируют возможности компилятора, компилятор всегда будет в состоянии «знать» о программе больше, чем любая статическая проверка. Кажется расточительным не использовать это для уменьшения ошибок, где это возможно.
Обновление 2:
cdleary - Теоретически, я согласен с вами, статический анализатор может выполнить любую проверку, которую может выполнить компилятор. А в случае с Python этого должно быть достаточно.
Однако, если ваш компилятор достаточно сложен (особенно если у вас много прагм, которые меняют способ компиляции, или если, как и в Perl, вы можете запускать код во время компиляции), тогда статический анализатор должен приближаться к сложности компилятора. / переводчик, чтобы сделать анализ.
Хех, все эти разговоры о сложных компиляторах и выполнении кода во время компиляции показывают мой фон Perl.
Насколько я понимаю, Python не имеет прагм и не может запускать произвольный код во время компиляции. Таким образом, если я не ошибаюсь или эти функции не добавлены, достаточно статического анализатора в статическом анализаторе. Конечно, было бы полезно форсировать эти проверки при каждом выполнении. Конечно, я бы сделал это с помощью прагмы.
После того, как вы добавили прагмы к миксу, вы пошли по скользкому пути, и сложность вашего анализатора должна возрасти пропорционально мощности и гибкости, которые вы предоставляете в своих прагмах. Если вы не будете осторожны, вы можете закончить как Perl, и тогда «только Python может анализировать Python», будущее, которое я бы не хотел видеть.
Возможно, ключ командной строки был бы лучшим способом добавить принудительный статический анализ;)
(Ни в коем случае не собираюсь ставить под сомнение возможности Python, когда я говорю, что он не может работать с поведением во время компиляции, как это может делать Perl. У меня есть догадка, что это тщательно продуманное проектное решение, и я вижу мудрость это. Предельная гибкость Perl во время компиляции, IMHO, большая сила и ужасная слабость языка; я вижу мудрость и в этом подходе.)