Я пытаюсь использовать модуль python-daemon. Он предоставляет класс daemon.DaemonContext для правильного демонстрации сценария. Хотя я в первую очередь нацелен на Python 2.6+, я бы хотел поддерживать обратную совместимость с версией 2.4.Работа с классами контекста в Python 2.4
Python 2.5 поддерживает импорт контекстов с будущим, но Python 2.4 не имеет такого объекта. Я понял, что могу просто уловить любую ошибку, с помощью которой высказывается утверждение, и вводить и выходить из контекста вручную для 2.4, но я не могу уловить SyntaxError.
Есть ли способ выполнить это, если явно не проверить версию интерпретатора? Ниже приводится суть того, что я пытаюсь сделать, и проблема, которую я получаю. В реальной жизни я не имею контроля над классом контекста, поэтому он должен работать без искажения исходного класса, то есть не так, как these ideas.
Никогда не считайте, если Python 2.4 не может запустить python-daemon; Я бы хотя бы хотел поймать ошибку и реализовать резервную копию или что-то в этом роде.
Спасибо за помощь.
#!/usr/bin/python2.4
from __future__ import with_statement
# with_statement isn't in __future__ in 2.4.
# In interactive mode this raises a SyntaxError.
# During normal execution it doesn't, but I wouldn't be able to catch it
# anyways because __future__ imports must be at the beginning of the file, so
# that point is moot.
class contextable(object):
def __enter__(self):
print('Entering context.')
return None
def __exit__(self, exc_type, exc_val, exc_tb):
print('Exiting context.')
return False
def spam():
print('Within context.')
context = contextable()
try:
with context: # This raises an uncatchable SyntaxError.
spam()
except SyntaxError, e: # This is how I would like to work around it.
context.__enter__()
try:
spam()
finally:
context.__exit__(None, None, None)
Я боялся этого. Как вы сказали, условная компиляция строки звучит довольно беспорядочно, потому что это не так. Поэтому я буду выбирать между модулями, сохраняя их как можно меньше. Что касается того, как различать, ловить ошибку и проверять версию, примерно одинаково «чист», так что быстрее - сравнивая sys.version_info каждый раз или иногда есть исключение? Это, вероятно, незначительно, но мне хотелось бы получить мнение. Спасибо за ваш быстрый ответ! –
@hippie, для микро-тестов, никогда не догадываться, всегда _measure_. 'timeit' - ваш друг. Редактирование моего A для примера. –
Конечно, проверка версии выполняется быстрее, чем компиляция. Чтобы что-либо сделать с помощью теста сравнения, ему нужно будет импортировать (компилировать) код, а не просто выполнять два назначения. Для Python 2.5 проверка исключения на самом деле немного быстрее (3.47s против 3.87s на моей машине с 1,000,000 итерациями через timeit). Однако на 2.4 проверка исключения примерно в 30 раз медленнее из-за того, что каждый раз захватывает SyntaxError. Проверка версии, очевидно, лучше, но ваш пример не показывает реальной причины. знак равно –