2010-10-26 13 views
5


He tenido que cambiar de pitón 2.7 a 2.6.
He estado usando un deque con la propiedad maxlen y he estado comprobando qué es el maxlen. Aparentemente puedes usar maxlen en python 2.6, pero en 2.6 deques no tienes un atributo maxlen.
¿Cuál es la forma más limpia de comprobar qué es el máximo de deque en python 2.6?Comprobar maxlen de deque en python 2.6

En 2.7:

from collections import deque 
d = deque(maxlen = 10) 
print d.maxlen 

En 2.6 deque se pueden utilizar y la maxlen funciona correctamente, pero maxlen no es un atributo que se puede denominar.

Saludos

Respuesta

5

Crearía mi propio deque heredando desde collections.deque. No es difícil. Es decir, aquí está:

import collections 

class deque(collections.deque): 
    def __init__(self, iterable=(), maxlen=None): 
     super(deque, self).__init__(iterable, maxlen) 
     self._maxlen = maxlen 
    @property 
    def maxlen(self): 
     return self._maxlen 

y esta es la nueva deque en el trabajo:

>>> d = deque() 
>>> print d 
deque([]) 
>>> print d.maxlen 
None 
>>> d = deque(maxlen=3) 
>>> print d 
deque([], maxlen=3) 
>>> print d.maxlen 
3 
>>> d = deque(range(5)) 
>>> print d 
deque([0, 1, 2, 3, 4]) 
>>> print d.maxlen 
None 
>>> d = deque(range(5), maxlen=3) 
>>> print d 
deque([2, 3, 4], maxlen=3) 
>>> print d.maxlen 
3 
+0

Una cosa: iterable y maxlen son ambos argumentos opcionales por lo que iterable necesita un valor predeterminado. Sin embargo, no puede pasar iterable = None a las colecciones.deque __init__, así que supongo que necesita una instrucción if. ¿Alguna mejor manera de resolver eso? – simonb

+0

En realidad, es más simple que eso. El valor predeterminado para iterable es la tupla vacía '()'. Editaré el código para reflejarlo en un momento. –

+0

Hecho. Con un ejemplo de uso. –

2

maxlen es una nueva parte de deque que se implementó por primera vez en Python 2.7. Simplemente no existe en Python 2.6.

Dicho esto, hay algunas cosas que puede hacer:

  1. crear una nueva clase que hereda todos los métodos y atributos de deque sino también implementa un atributo maxlen.
  2. Adaptar su código para que maxlen no es necesario
1

Bueno, si usted no tiene el atributo maxlen, que sólo puede robar de la representación:

>>> import re 

>>> d = deque(maxlen=42) 

>>> d.__repr__() 
'deque([], maxlen=42)' 

>>> int(re.sub("\)$","",re.sub(".*=","",d.__repr__()))) 
42 

Sí, Sé que es horrible. Preferiría actualizar a 2.7 yo mismo, pero a veces no se nos da el poder que deseamos, y tenemos que recurrir a kludges como este.

+0

¿Por qué publicaría una brujería tan oscura? –

+1

Hmm, no sé. Tal vez porque funciona? Específicamente dije que no era la solución preferida pero, si tus manos están atadas, te ayudará a pasar. – paxdiablo

+0

Y también falla cuando se crea un deque con 'maxlen = None'. –

2

me gustaría crear mi propia clase que hereda de cola deque. Algo como:

class Deque(deque): 
    def __init__(self,*args,**kwargs): 
     deque.__init__(self, *args, **kwargs) 
     self.maxlen = kwargs.get('maxlen',None) 

>>>d = Deque(maxlen=10) 
>>>d.maxlen 
>>>10