Ответ на этот вопрос неоднозначен, потому что Python динамический язык. В общем случае код может производить практически любые действия от простого изменения
globals()
(например
_
из стандартной
gettext
) до замены следующего кода на другой (например автоматический импорт модулей в библиотеке
ipython-autoimport). Поэтому без выполнения кода не получится определить будет ли исключение NameError или нет.
Если вы не используете подобные идиомы в разработке, то помогут любые линтеры (например pyflakes, flake8, pylint), которые выведут отчёт по многим логическим/синтаксическим ошибкам в коде, включая неопределённые переменные. Если требуется программно определять, то возможно достаточно будет
pyflakes.