Python-интерфейс класса W/ телнет к memcached


У меня не было кто-нибудь помочь мне С код ревью и т. д., Так что я думал, что я отправлю класса в Python, я собрал для сопряжения с telnet для получения информации с сервера memcached.

import re, telnetlib

class MemcachedStats:

    _client = None

    def __init__(self, host='localhost', port='11211'):
        self._host = host
        self._port = port

    @property
    def client(self):
        if self._client is None:
            self._client = telnetlib.Telnet(self._host, self._port)
        return self._client

    def key_details(self, sort=True):
        ' Return a list of tuples containing keys and details '
        keys = []
        slab_ids = self.slab_ids()
        for id in slab_ids:
            self.client.write("stats cachedump %s 100\n" % id)
            response = self.client.read_until('END')
            keys.extend(re.findall('ITEM (.*) \[(.*); (.*)\]', response))
        if sort:
            return sorted(keys)
        return keys

    def keys(self, sort=True):
        ' Return a list of keys in use '
        return [key[0] for key in self.key_details(sort=sort)]

    def slab_ids(self):
        ' Return a list of slab ids in use '
        self.client.write("stats items\n")
        response = self.client.read_until('END')
        return re.findall('STAT items:(.*):number', response)

    def stats(self):
        ' Return a dict containing memcached stats '
        self.client.write("stats\n")
        response = self.client.read_until('END')
        return dict(re.findall("STAT (.*) (.*)\r", response))

Это тоже на Гитхабе.

Я хотел бы некоторую обратную связь на:

  • Организация
  • Более эффективные способы достижения того же результата


1237
10
задан 6 февраля 2011 в 01:02 Источник Поделиться
Комментарии
1 ответ

Шаблон

self.client.write("some command\n")
response = self.client.read_until('END')

появляется три раза в коде. Я думаю, что это часто достаточно, чтобы гарантировать рефакторинг его в свой собственный метод, как это:

def command(self, cmd):
self.client.write("%s\n" % cmd)
return self.client.read_until('END')


В key_details вы используете расширения , чтобы создать список. Однако это более подходящие для Python, чтобы использовать список осмысленностей, чем построение списка в обязательном порядке. Таким образом, я рекомендую использовать следующее понимание списка:

regex = 'ITEM (.*) \[(.*); (.*)\]'
cmd = "stats cachedump %s 100"
keys = [key for id in slab_ids for key in re.findall(regex, command(cmd % id))]


Потом вы делаете это:

if sort:
return sorted(keys)
return keys

Теперь это может быть дело вкуса, но я предпочел бы написать это с помощью другого:

if sort:
return sorted(keys)
else:
return keys

Я думаю, что это оптически более приятным как вернутьсяс отступом на том же уровне. Это также делает его сразу очевидно, что второе возвращение - это то, что происходит в случае , если условие ложно.

7
ответ дан 6 февраля 2011 в 05:02 Источник Поделиться