2010-10-26 9 views
5


Ich musste von Python 2.7 auf 2.6 ändern.
Ich habe eine Deque mit der Maxlen-Eigenschaft verwendet und habe überprüft, was die Maxlen ist. Anscheinend können Sie Maxlen in Python 2.6 verwenden, aber in 2.6 haben Deques kein Maxlen-Attribut.
Was ist der sauberste Weg zu überprüfen, was der Maxlen einer Deque in Python 2.6 ist?Maxlen von Deque in Python überprüfen 2.6

In 2.7:

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

In 2.6 kann die deque verwendet werden und die maxlen funktioniert, aber maxlen ist kein Attribut, auf die verwiesen werden kann.

Prost

Antwort

5

Ich würde meine eigene deque durch Erben von collections.deque erstellen. Es ist nicht schwer. Das heißt, hier ist es:

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 

und das ist die neue deque bei der Arbeit:

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

Eine Sache - iterable und maxlen sind beide optionale Argumente, so dass iterable einen Standardwert benötigt. Du kannst iterable = None jedoch nicht an die collections.deque übergeben __init__ also denke ich, dass es eine if-Anweisung braucht? Gibt es einen besseren Weg, das herauszufinden? – simonb

+0

Eigentlich ist es einfacher als das. Der Standardwert für iterable ist das leere Tupel '()'. Ich werde den Code bearbeiten, um das in einem Moment zu reflektieren. –

+0

Fertig. Mit einem Anwendungsbeispiel. –

2

maxlen ist ein neuer Teil deque, die zuerst in Python 2.7 umgesetzt wurden. Es existiert einfach nicht in Python 2.6.

Das heißt, es gibt ein paar Dinge, die Sie tun können:

  1. eine neue Klasse erstellen, die alle Methoden und Attribute von deque erbt, sondern auch implementiert ein maxlen Attribut.
  2. Code anpassen, so dass maxlen
1

Nun ist nicht notwendig, wenn Sie das maxlen Attribut nicht haben, können Sie es nur aus der Darstellung stehlen:

>>> import re 

>>> d = deque(maxlen=42) 

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

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

Ja, ich Ich weiß, es ist schrecklich. Ich würde es vorziehen, selbst auf 2,7 zu ​​aktualisieren, aber manchmal haben wir nicht die Macht, die wir uns wünschen, und wir müssen auf solche Kludges zurückgreifen.

+0

Warum würden Sie solche dunkle Zauberei posten? –

+1

Hmm, ich weiß es nicht. Vielleicht weil es funktioniert? Ich sagte ausdrücklich, dass es nicht die bevorzugte Lösung ist, aber wenn deine Hände gebunden sind, dann wird es dich durchkommen lassen. – paxdiablo

+0

Und es schlägt auch fehl, wenn eine Deque mit 'maxlen = None' erstellt wird. –

2

Ich würde meine eigene Warteschlange Klasse erstellen, die von deque erbt. Etwas wie:

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