簡體   English   中英

如何使用Python 2.5到3.4中的collections.deque移植此代碼?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM