如何检查python ContextDecorator中的资源是否分配正确?

时间:2018-12-27 13:32:33

标签: python python-3.x exception with-statement contextmanager

我上课

class Resource:
    __init__(self):
        self.resource = ...
    __enter__(self):
        #can fail, such as file open returning error, memory allocation fail, or any more complicated failure
    __exit__(self,*args):
        ...

现在我要

with Resource() as r:
    r.do_stuff()

但是,如果r无法成功__enter__(),则失败。

正确的,pythonic处理方式是什么?

我不想使用一些is_allocated_correctly

像这样

with Resource() as r:
    if r.is_allocated_correctly():
        r.do_stuff()

因为它打破了with语句的重点。

请给我一些想法,在这里做什么。

1 个答案:

答案 0 :(得分:2)

with语句的目的是在块完成之后正确地释放资源或重置状态。

如果您无法正确输入上下文块,则需要在with语句之外进行处理。

try/except包围整个事情:

try:
    with Resource() as r:
        r.do_stuff()
except ResourceException as error:
    handle_error(error)

或者如果您无法对错误采取任何措施,只需让它通过:

with Resource() as r:
    r.do_stuff()