SyntaxError
диагностируется компилятором Python во время его компиляции - вы, вероятно, пытаетесь «поймать» его из кода, который компилируется как часть того же модуля (например, это то, что вы делаете в своем кодепример), поэтому, конечно, это не сработает - ваш «перехватывающий» код еще не скомпилирован (потому что компиляция завершилась неудачно), поэтому он не может ничего перехватить.
Необходимо убедиться, чтокод, который может иметь синтаксическую ошибку, компилируется на позже , чем код перехвата - либо поместите его в отдельный модуль, который вы импортируете в предложении try
, либо в строку, которую вы compile
создаете-в этом имени (позже вы можете выполнить байт-код, полученный в результате вызова compile
, если он успешно завершится).
Я думаю, что ни одна из этих возможностей не подходит для ваших целей.Я подозреваю, что использование двух отдельных модулей (и, вероятно, выбор между ними в зависимости от проверки «делает ли это компиляция», но проверка версии звучит для меня чище), к сожалению, является единственным «чистым» решением.
Редактировать : вот как пробовать микробенчмарк пробовать / исключать проверки версий:
$ python2.4 -mtimeit 'try:
compile("with x: pass", "", "exec")
except SyntaxError: x=1
else: x=2'
100000 loops, best of 3: 10.8 usec per loop
$ python2.6 -mtimeit 'try:
compile("with x: pass", "", "exec")
except SyntaxError: x=1
else: x=2'
10000 loops, best of 3: 40.5 usec per loop
$ python2.4 -mtimeit -s'import sys' 'if sys.version>="2.5": x=2
else: x=1'
1000000 loops, best of 3: 0.221 usec per loop
$ python2.6 -mtimeit -s'import sys' 'if sys.version>="2.5": x=2
else: x=1'
10000000 loops, best of 3: 0.156 usec per loop
Как видите, версия, которую я считаю чище, 10.8 / 0.221
, почти в 50 раз быстрее, на 2,4 и40.5 / 0.156
, почти в 260 раз быстрее, на 2,6.В целом (за редкими исключениями) чистый (то есть «питонический») подход окажется лучше оптимизированным в Python - часто, по крайней мере, одна из причин может заключаться в том, что разработчики ядра Python сосредоточены на содействии и поощрениииспользование конструкций, которые им нравятся, а не конструкции, которые им не нравятся.