Question

Y at-il backport pour les méthodes suivantes à travailler avec Python 2.4:

any, all, collections.defaultdict, collections.deque
Était-ce utile?

La solution

Eh bien, au moins pour any et all il est facile:

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 est déjà en 2.4.

En ce qui concerne defaultdict, je suppose que vous pouvez imiter ce facilement avec setdefault().

Je cite Alex Martelli`s (et d'autres) fortement recommandé Python Cookbook :

  

est ce que la méthode setdefault de   dictionnaires est pour. Disons que nous sommes   la construction d'un mot à la page numéros   index, un dictionnaire qui associe chaque mot   à la liste des numéros de page où il   apparaît. Un élément clé de code dans ce   application peut être:

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

Ce code est équivalent à plus   approches bavard telles que:

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

et

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

Autres conseils

Comme le souligne Tim, all et any sont insignifiants. defaultdict est pas beaucoup plus difficile. Voici une mise en œuvre passable je crois. Il est essentiellement une traduction des documents en code.

Mise à jour: suppression de l'expression ternaire parce que je me suis souvenu que ce n'est pas dans 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)

Si vous utilisez juste pour construire un dict, alors vous voudrez peut-être changer le EAFP à LBYL pour __getitem__. Actuellement, il est optimisé pour construire le dict et ensuite l'utiliser pendant un certain temps avec beaucoup de non-lookups manquer.

deque va être plus difficile. Je voudrais avoir le temps de le faire juste parce qu'il est probablement mon favori sur des collections, mais il est non trivial. Qu'à cela ne tienne. Il suffit de lire Tims publier tout le long. Vous avez obtenu votre souhait.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top