我正在使用python-mpd2模塊在GUI應用程序中控制Raspberry Pi上的媒體播放器。因此,我想在後臺優雅地處理連接錯誤和超時(玩家在60秒後放棄MPD連接)。但是,MPD模塊沒有單個輸入點,通過它可以發送所有命令或檢索可以修補的信息。在Python中代理一個類
我想要一個允許訪問所有mpd.MPDClient相同方法的類,但讓我添加自己的錯誤處理。換句話說,如果我這樣做:
client.play()
並引發connectione錯誤,我想趕上它,並重新發送相同的命令。除了必須重新連接到服務器造成的小延遲之外,用戶不應該注意到任何錯誤。
到目前爲止,這裏是我提出的解決方案。它在我的應用程序中工作,但並未真正實現我的目標。
from functools import partial
from mpd import MPDClient, ConnectionError
class PersistentMPDClient(object):
def __init__(self, host, port):
self.host = host
self.port = port
self.client = MPDClient()
self.client.connect(self.host, self.port)
def command(self, cmd, *args, **kwargs):
command_callable = partial(self.client.__getattribute__(cmd), *args, **kwargs)
try:
return command_callable()
except ConnectionError:
# Mopidy drops our connection after a while, so reconnect to send the command
self.client._soc = None
self.client.connect(self.host, self.port)
return command_callable()
我的方法添加到這個類的每一個MPD命令,例如:
def play(self):
return self.command("play")
但這似乎遠遠沒有最好的方式來完成它。
需要處理多少個*命令? – shx2
有91個命令。並非所有這些都是必要的或將用於我的應用程序,但其中很大一部分是。 –
如果您不介意創建所有91個字符串形成*命令名稱*的列表,您可以按照[此答案](http://stackoverflow.com/a/534597/2096752)的方式進行操作。我相信這種方法具有許多優點,因爲它涉及的魔法較少。 OTOH,91確實很多,所以更基本的基於__getattr__的解決方案可能更合適。 – shx2