2014-01-06 2 views
1

Я хочу найти элегантный способ сделать следующее:Элегантный способ использования ресурса в Python?

try: 
    with some_resource: 
     # got it 
     do_something() 

except ResourceUnavailableError: 
    # didn't get it 
    do_something_else() 

This:

  1. пытается получить ресурс
  2. на успех, он делает что-то, а затем освобождает ресурс правильно
  3. на провал, он делает что-то другое

Хотя не многие строки кода, я нахожу, что если мне придется писать это во многих разных местах, это не очень элегантно.

Я почти жаль, что я мог бы написать что-то следующим образом (я знаю, что это не код реального Python):

with some_resource: 
    # got it 
    do_something() 

# an optional else 
else: 
    # didn't get it 
    do_something_else() 

Кто-нибудь знает, если это возможно, чтобы написать что-то вдоль этих линий в Python? Спасибо!

ответ

4

Нет, with не имеет else блок. Но вы можете написать свой собственный менеджер контекста, который обрабатывает else части:

from contextlib import contextmanager 

@contextmanager 
def handle_unavailable(resource, exception, exception_handler): 
    try: 
     with resource: 
      yield resource 
    except exception: 
     exception_handler() 

и использовать его, как это везде так:

with handle_unavailable(some_resource, ResourceUnavailableError, do_something_else): 
    do_something() 

Итак, если ResourceUnavailableError поднят в with блоке, do_something_else вызываются для вы.

Это использует @contextlib.contextmanager() decorator, что делает запись ваших собственных менеджеров контекста практически тривиальной.

+0

Благодарим за отзыв! Но ... я не уверен, что это работает. Я пробовал его кодировать, и когда не было сделано никаких исключений, все было хорошо. Но если возникло исключение, то после запуска exception_handler() я получил: RuntimeError: генератор не уступил. – moomima

+0

BTW, эта ошибка привела меня к другому, аналогичный пост здесь, который также, казалось, закончился в страданиях: P http://stackoverflow.com/questions/4314338/can-i-use-python-with-statement- for-conditional-execution – moomima

+0

А, крошки. Действительно, я предположил, что вы имели в виду, что исключение будет создано в блоке 'with', а не в создании ресурса. –

Смежные вопросы