Как отмечено выше, синтаксические ошибки возникают во время компиляции, а не во время выполнения. Хотя Python является «интерпретируемым языком», код Python фактически не интерпретируется напрямую; он компилируется в байтовый код, который затем интерпретируется. Существует этап компиляции, который происходит, когда модуль импортируется (если нет уже скомпилированной версии, доступной в виде файла .pyc или .pyd), и именно тогда вы получаете ошибку, а не (совершенно точно), когда ваш код работает
Вы можете отложить шаг компиляции и сделать это во время выполнения для одной строки кода, если хотите, используя eval, как отмечено выше, но я лично предпочитаю избегать этого, потому что это вызывает Python чтобы выполнить потенциально ненужную компиляцию во время выполнения, с одной стороны, и с другой стороны, это создает то, что для меня кажется беспорядком кода. (Если вы хотите, вы можете сгенерировать код, который генерирует код, который генерирует код - и у вас будет невероятное время, чтобы изменить и отладить его через 6 месяцев.) Поэтому вместо этого я бы порекомендовал нечто подобное:
import sys
if sys.hexversion < 0x02060000:
from my_module_2_5 import thisFunc, thatFunc, theOtherFunc
else:
from my_module import thisFunc, thatFunc, theOtherFunc
.. что я бы сделал, даже если бы у меня была только одна функция, использующая новый синтаксис, и она была очень короткой. (На самом деле, я бы принял все разумные меры, чтобы минимизировать количество и размер таких функций. Я мог бы даже написать такую функцию, как ifTrueAElseB (cond, a, b) с этой единственной строкой синтаксиса.)
Еще одна вещь, на которую, возможно, стоит обратить внимание (на которую я немного удивлен, пока никто не указал), это то, что, хотя более ранние версии Python не поддерживали такой код, как
value = 'yes' if MyVarIsTrue else 'no'
.. он поддерживал код вроде
value = MyVarIsTrue and 'yes' or 'no'
Это был старый способ написания троичных выражений. У меня еще не установлен Python 3, но, насколько я знаю, этот «старый» способ работает до сих пор, так что вы можете сами решить, стоит ли его условно использовать новый синтаксис, если вам нужно поддерживать использование более старых версий Python.