首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在contextmanager中使用产率两次

在contextmanager中使用产率两次
EN

Stack Overflow用户
提问于 2016-03-29 21:51:40
回答 1查看 2.9K关注 0票数 4

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

代码语言:javascript
复制
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块吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2016-03-29 22:18:21

简单地说,你不能从上下文管理器中屈服两次。您可以考虑使用一个装饰器来包装您要执行的内容,并在放弃之前重新尝试和重新连接一组次数。这里有一个简单的(非生产用途)示例来说明:

代码语言:javascript
复制
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()

编辑:在无参数情况下添加对装饰器的调用

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36295766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档