Verifique Maxlen de Deque no Python 2.6
-
26-09-2019 - |
Pergunta
Eu tive que mudar de Python 2.7 para 2.6.
Eu tenho usado um deque com a propriedade Maxlen e tenho verificado o que é o Maxlen. Aparentemente, você pode usar o Maxlen no Python 2.6, mas em 2.6 Deques não possuem um atributo maxlen.
Qual é a maneira mais limpa de verificar o que é o maxleno de um deque no Python 2.6?
Em 2.7:
from collections import deque
d = deque(maxlen = 10)
print d.maxlen
Em 2.6, o deque pode ser usado e o Maxlen funciona corretamente, mas Maxlen não é um atributo que pode ser referido.
Felicidades
Solução
Eu criaria o meu próprio deque
herdando de collections.deque
. Não é difícil. Ou seja, aqui 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
E este é o novo deque no trabalho:
>>> 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
Outras dicas
maxlen
é uma nova parte de deque
Isso foi implementado pela primeira vez no Python 2.7. Ele simplesmente não existe no Python 2.6.
Dito isto, há algumas coisas que você pode fazer:
- Criar uma nova classe que herda todos os métodos e atributos de
deque
mas também implementa ummaxlen
atributo. - Adapte seu código para que
maxlen
não é necessário
Eu criaria minha própria aula de filas que herda de 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
Bem, se você não tem o maxlen
atributo, você pode simplesmente roubá -lo da representação:
>>> import re
>>> d = deque(maxlen=42)
>>> d.__repr__()
'deque([], maxlen=42)'
>>> int(re.sub("\)$","",re.sub(".*=","",d.__repr__())))
42
Sim, eu sei que é horrível. Eu preferiria atualizar para o 2.7, mas às vezes não recebemos o poder que desejamos, e temos que recorrer a kludges como esse.