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