2010-10-26 33 views
5


Tôi đã phải thay đổi từ trăn 2,7 đến 2,6.
Tôi đã sử dụng deque với thuộc tính maxlen và đã kiểm tra xem maxlen là gì. Rõ ràng bạn có thể sử dụng maxlen trong python 2.6, nhưng trong 2.6 deques không có thuộc tính maxlen.
Cách sạch nhất để kiểm tra xem hàm lượng tối đa của một deque là gì trong python 2.6?Kiểm tra maxlen deque trong python 2.6

Trong 2,7:

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

Trong 2,6 các deque có thể được sử dụng và maxlen hoạt động đúng, nhưng maxlen không phải là một thuộc tính có thể được gọi.

Cheers

Trả lời

5

Tôi sẽ tạo riêng của mình deque bằng cách kế thừa từ collections.deque. Nó không phải là khó khăn. Cụ thể, ở đây nó là:

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 

và đây là deque mới tại nơi làm việc:

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

Một điều - lặp lại và maxlen là cả hai đối số tùy chọn để có thể lặp lại cần một giá trị mặc định. Tuy nhiên bạn không thể vượt qua iterable = Không có để collections.deque __init__ vì vậy tôi đoán nó cần một tuyên bố nếu? Có cách nào tốt hơn để phân loại nó ra không? – simonb

+0

Thực ra nó đơn giản hơn thế. Giá trị mặc định cho iterable là tuple rỗng '()'. Tôi sẽ chỉnh sửa mã để phản ánh điều đó trong giây lát. –

+0

Xong. Với một ví dụ về sử dụng. –

2

maxlen là một phần mới của deque đã được thực hiện đầu tiên trong Python 2.7. Nó không tồn tại trong Python 2.6.

Điều đó nói rằng, có một vài điều bạn có thể làm:

  1. Tạo một lớp mới mà được thừa hưởng tất cả các phương pháp và các thuộc tính từ deque mà còn thực hiện một thuộc tính maxlen.
  2. Thích ứng mã của bạn để maxlen là không cần thiết
1

Vâng, nếu bạn không có các thuộc tính maxlen, bạn chỉ có thể ăn cắp nó từ các đại diện:

>>> import re 

>>> d = deque(maxlen=42) 

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

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

Vâng, tôi biết nó thật khủng khiếp. Tôi muốn nâng cấp lên 2,7 bản thân mình nhưng đôi khi chúng tôi không có quyền lực chúng tôi mong muốn, và chúng tôi phải nghỉ mát để kludges như thế này.

+0

Tại sao bạn đăng thuật sĩ tối như vậy? –

+1

Hmm, tôi không biết. Có lẽ vì nó hoạt động? Tôi đặc biệt nói nó không phải là giải pháp ưa thích nhưng nếu tay bạn bị trói, thì nó sẽ giúp bạn vượt qua. – paxdiablo

+0

Và nó cũng thất bại khi một deque được tạo ra với 'maxlen = None'. –

2

tôi sẽ tạo ra lớp hàng đợi riêng tôi được thừa kế từ deque. Một cái gì đó như:

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 
Các vấn đề liên quan