если Вы используете оракула 10/11g... Ретроспективный кадр
http://www.oracle.com/technology/deploy/availability/htdocs/Flashback_Overview.htm
Это в основном поддерживает раздвижное окно журналов отмены, на которые могут сослаться время или именованный маркер. Это обесточивает простой отменить дневную ценность изменений через пару минут. не снижая базу данных.
Когда у вас часто возникают состояния гонки, EAFP (проще попросить прощения, чем разрешения) работает лучше, чем LBYL (смотрите, прежде чем прыгать)
Не могли бы вы перехватить исключение, а затем проверить, существует ли файл как каталог?
Вместо
if not os.path.exists(self.cache_location):
os.mkdir(self.cache_location)
вы можете сделать
try:
os.makedirs(self.cache_location)
except OSError:
pass
Так как в итоге вы получите ту же функциональность .
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не знаю, как это может быть в Pythonic.
Использование SQLite3
, может быть немного излишним, но добавит много функциональности и гибкости вашему варианту использования.
Если вы приходится делать много «выбора», одновременной вставки и фильтрации, использование SQLite3
- отличная идея, поскольку он не добавляет слишком много сложности по сравнению с простыми файлами (можно утверждать, что это устраняет сложность).
Перечитывая ваш вопрос (и комментарии), я могу лучше понять вашу проблему.
Какова вероятность того, что файл может создать такое же состояние гонки?
Если он достаточно мал, я бы сделал что-то вроде:
if not os.path.isfile(self.cache_location):
try:
os.makedirs(self.cache_location)
except OSError:
pass
Кроме того, читая ваш код, я Я бы изменил
else:
# Our target dir is already a file, or different error,
# relay the error!
raise OSError(e)
на
else:
# Our target dir is already a file, or different error,
# relay the error!
raise
, так как это действительно то, что вы хотите, Python повторно вызывает точно такое же исключение (просто придирки) .
Еще одна вещь, может быть это может быть вам полезен (только для Unix).