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

Foi útil?

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:

  1. Criar uma nova classe que herda todos os métodos e atributos de deque mas também implementa um maxlen atributo.
  2. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top