Я использую модуль python-mpd2 для управления медиаплеером на малине Pi в приложении GUI. Таким образом, я хотел бы изящно обрабатывать ошибки соединения и тайм-ауты (например, этот игрок упускает MPD-соединения через 60 секунд) в фоновом режиме. Тем не менее, модуль 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