Python Backports для некоторых методов - PullRequest
2 голосов
/ 24 сентября 2010

Есть ли какой-нибудь бэкпорт для следующих методов работы с python 2.4:

any, all, collections.defaultdict, collections.deque

Ответы [ 2 ]

5 голосов
/ 24 сентября 2010

Как указывает Тим, all и any тривиальны. defaultdict не намного сложнее. Вот сносная реализация, я верю. По сути это перевод документации в код.

обновление: удалено троичное выражение, потому что я вспомнил, что это не в 2.4

class defaultdict(dict):
     def __init__(self, default_factory, *args, **kwargs):
         super(defaultdict, self).__init__(*args, **kwargs)
         self.default_factory = default_factory

     def __missing__(self, key):
         try:
             self[key] = self.default_factory()
         except TypeError:
             raise KeyError("Missing key %s" % (key, ))
         else:
             return self[key]

     def __getitem__(self, key):
         try:
             return super(defaultdict, self).__getitem__(key)
         except KeyError:
             return self.__missing__(key)

Если вы просто используете его для создания диктата, вы можете изменить EAFP на LBYL для __getitem__. сейчас он оптимизирован, чтобы создать диктовку, а затем использовать ее некоторое время с множеством поисков без пропусков.

deque будет сложнее. Хотелось бы, чтобы у меня было время сделать это только потому, что это, наверное, мой любимый из коллекций, но это не тривиально. не бери в голову. Просто прочитайте Тимс пост полностью. Вы получили свое желание.

5 голосов
/ 24 сентября 2010

Ну, по крайней мере для any и all это просто:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True

deque уже в 2,4.

Что касается defaultdict, я думаю, выsetdefault().

Цитата из книги Алекса Мартелли (и других), настоятельно рекомендованной Python Cookbook :

Это то, чтоМетод setdefault для словарей предназначен для.Скажем, мы создаем индекс слова для номера страницы, словарь, который отображает каждое слово в список номеров страниц, где оно появляется.Ключевым фрагментом кода в этом приложении может быть:

def addword(theIndex, word, pagenumber):
    theIndex.setdefault(word, [ ]).append(pagenumber)

Этот код эквивалентен более подробным подходам, таким как:

def addword(theIndex, word, pagenumber):
    if word in theIndex:
        theIndex[word].append(pagenumber)
    else:
        theIndex[word] = [pagenumber]

и:

def addword(theIndex, word, pagenumber):
    try:
        theIndex[word].append(pagenumber)
    except KeyError:
        theIndex[word] = [pagenumber]
...