两次使用上下文

2024-04-28 21:26:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用contextmanager隐藏一些try/except复杂性。下面是一个简单的例子:

from contextlib import contextmanager
import mpd

mpdclient = mpd.MPDClient()
mpdclient.connect("localhost", 6600)

@contextmanager
def mpdcontext():
  try:
    yield
  except mpd.ConnectionError:
    mpdclient.connect("localhost", 6600)

with mpdcontext():
  mpdclient.status()

with mpdcontext():
  mpdclient.lsinfo()

现在,据我所知,with语句中的块是在调用yield时执行的。在我的例子中,如果这引发了一个异常,我会重新连接到mpd。我能在重新连接之后再次执行with块吗?在

谢谢


Tags: fromimportlocalhostconnectwith例子mpd复杂性
1条回答
网友
1楼 · 发布于 2024-04-28 21:26:51

简单的回答是,上下文管理器不能有两次让步。你可以考虑使用一个decorator来包装你正在尝试执行的内容,并在放弃之前重试并重新连接一段时间。下面是一个简单的(非生产性使用)示例来说明:

import mpd
import functools

HOST = "localhost"
PORT = 6600
mpdclient = mpd.MPDClient()
mpdclient.connect(HOST, PORT)

def withreconnect(retries=1):
    def _wrapper(func):
        @functools.wraps(func)
        def wrapped(*args, **kwargs):
            for _ in range(retries + 1): # Loop retries + first attempt
                try:
                    return func(*args, **kwargs)
                except mpd.ConnectionError:
                    mpdclient.connect(HOST, PORT)
        return _wrapped
    return wrapped

@withreconnect() # Reconnect 1 time, default
def status():
    mpdclient.status()

@withreconnect(retries=3) # Reconnect 3 times
def lsinfo():
    mpdclient.lsinfo()

Edit:添加了对decorator的调用,在没有参数的情况下

相关问题 更多 >