backports python pour certaines méthodes
Question
Y at-il backport pour les méthodes suivantes à travailler avec Python 2.4:
any, all, collections.defaultdict, collections.deque
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.
Qu'à cela ne tienne. Il suffit de lire Tims publier tout le long. Vous avez obtenu votre souhait. 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.