[英]How can I port this code using collections.deque from Python 2.5 to 3.4?
如何將此代碼從2.5版本移植到3.4版本?
from __future__ import with_statement
from ..globals import addonPath
import os, time
import collections
class TailDeque(collections.deque):
'''Implementation of deque with limited maxlen support for Python 2.5.'''
def __init__(self, iterable=None, maxlen=20):
super(TailDeque, self).__init__([])
self.maxlen = maxlen
if iterable is not None:
self.extend(iterable)
def extend(self, iterable):
for item in iterable:
self.append(item)
def extendleft(self, iterable):
for item in iterable:
self.appendleft(item)
def appendleft(self, item):
if len(self) == self.maxlen:
self.pop()
super(TailDeque, self).appendleft(item)
def append(self, item):
if len(self) == self.maxlen:
self.popleft()
super(TailDeque, self).append(item)
logPath = os.path.join( addonPath, "log.txt" )
logQueue = TailDeque()
def log(text):
return
logQueue.append(time.strftime("%H:%M:%S") + " - " + text)
with open(logPath, "w") as fs:
fs.write('\n'.join(logQueue))
第10行:self.maxlen = maxlen
AttributeError:'collections.deque'對象的屬性'maxlen'不可寫
我想你需要替換這兩行:
super(TailDeque, self).__init__([])
self.maxlen = maxlen
有:
if sys.version_info <= (2, 5):
super(TailDeque, self).__init__([])
self.maxlen = maxlen
else:
super(TailDeque, self).__init__([], maxlen=maxlen)
如果您不需要保持與Python 2.5的兼容性,那么您可以更簡單一些:
super(TailDeque, self).__init__([], maxlen=maxlen)
在Python 2.5中 , collections.deque
的構造函數只接受了一個可迭代的參數:
deque([iterable])
所以你必須在初始化對象后設置maxlen 。
在Python 2.6中 ,您可以將maxlen作為可選參數提供:
collections.deque([iterable[, maxlen]])
這與Python 3.4保持一致。 我認為將其設置為構造函數參數是從2.6開始的首選方法。 他們無法在2.x系列中刪除你的方法 - 直接設置屬性,因為他們不想破壞向后兼容性。
使用Python 3,沒有這樣的問題,因此使用構造函數參數成為您可以使用的唯一方法。
而不是使用空列表初始化然后使用用戶提供的uptrable進行擴展,為什么不直接將該iterable傳遞給collections.deque
? 即
super(TailDeque, self).__init__(iterable, maxlen=maxlen)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.