Question


J'ai dû changer de Python 2.7 à 2.6.
Je me sers d'un deque avec la propriété maxlen et ont été vérifier ce que le maxlen est. Apparemment, vous pouvez utiliser maxlen en python 2.6, mais 2.6 Deques ne possède pas d'attribut maxlen.
Quelle est la plus propre moyen de vérifier ce que le Maxlen d'un deque est en python 2.6?

2.7:

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

Dans le 2.6 deque peut être utilisé et les travaux maxlen correctement, mais maxlen n'est pas un attribut qui peut être appelé.

Vive

Était-ce utile?

La solution

Je voudrais créer mon propre deque en héritant de collections.deque. Ce n'est pas difficile. A savoir, la voici:

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

et c'est le nouveau deque au travail:

>>> 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

Autres conseils

maxlen est une nouvelle partie de deque qui a d'abord été mis en œuvre en Python 2.7. Il n'existe tout simplement pas en Python 2.6.

Cela dit, il y a quelques choses que vous pouvez faire:

  1. Créer une nouvelle classe qui hérite de toutes les méthodes et les attributs de deque mais met également en œuvre un attribut maxlen.
  2. Adaptez votre code afin que maxlen n'est pas nécessaire

Je voudrais créer ma propre classe de file d'attente qui hérite de deque. Quelque chose comme:

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

Eh bien, si vous n'avez pas l'attribut maxlen, vous pouvez simplement voler de la représentation:

>>> import re

>>> d = deque(maxlen=42)

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

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

Oui, je sais que c'est horrible. Je préférerais passer à 2,7 moi, mais parfois nous ne sommes pas donné le pouvoir que nous désirons, et nous devons recourir à des bidouilles comme celui-ci.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top