backports pitón para algunos métodos
Pregunta
¿Hay alguna backport de los siguientes métodos para trabajar con Python 2.4:
any, all, collections.defaultdict, collections.deque
Solución
Bueno, al menos para any
y all
es fácil:
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
ya está en 2,4.
En cuanto a defaultdict
, supongo que puede emular fácilmente con setdefault()
.
Citando de Alex Martelli`s (y de otros) muy recomendable Python Cookbook :
Esto es lo que el método de setdefault diccionarios es para. Decimos que estamos la construcción de una palabra-a-page-números índice, un diccionario que mapea cada palabra a la lista de los números de página donde se aparece. Una pieza clave de código en ese aplicación podría ser:
def addword(theIndex, word, pagenumber):
theIndex.setdefault(word, [ ]).append(pagenumber)
Este código es equivalente a más verbosa enfoques tales como:
def addword(theIndex, word, pagenumber):
if word in theIndex:
theIndex[word].append(pagenumber)
else:
theIndex[word] = [pagenumber]
y
def addword(theIndex, word, pagenumber):
try:
theIndex[word].append(pagenumber)
except KeyError:
theIndex[word] = [pagenumber]
Otros consejos
Como Tim señala, all
y any
son triviales. defaultdict
no es mucho más difícil. He aquí una aplicación aceptable creo. Básicamente se trata de una traducción de los documentos en código.
Actualización: Se ha eliminado la expresión ternaria porque recordé que eso no está en 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 usted está usando para construir un diccionario, entonces es posible que desee cambiar el EAFP a LBYL para __getitem__
. en este momento está optimizada para construir el dict y luego usarlo durante un tiempo con una gran cantidad de operaciones de búsqueda no se pierda.
Nunca mente. Basta con leer Tims publicar todo el camino a través. Usted consiguió su deseo. deque
va a ser más difícil. Me gustaría tener el tiempo para hacer eso sólo porque es probablemente mi favorita fuera de las colecciones pero es no trivial.