gpt4 book ai didi

python - 在 contextmanager 中使用 yield 两次

转载 作者:行者123 更新时间:2023-11-28 21:10:42 26 4
gpt4 key购买 nike

我试图用上下文管理器隐藏一些 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 语句中的 block 在调用 yield 时执行。就我而言,如果这引发异常,我会重新连接到 mpd。重新连接后,我能以某种方式再次执行 with-block 吗?

谢谢

最佳答案

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

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()

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

关于python - 在 contextmanager 中使用 yield 两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36295766/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com