如何使用 collections.deque 将此代码从 Python 2.5 移植到 3.4?
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 = 最大长度
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)
如果不需要保持与Python2.5的兼容,可以简单一点:
super(TailDeque, self).__init__([], maxlen=maxlen)
动机
在Python 2.5中,collections.deque
的构造函数只有一个参数,iterable:
<strong>deque</strong>([<em>iterable</em>])
所以你必须在初始化对象后设置 maxlen。
在 Python 2.6 中,您可以提供 maxlen 作为可选参数:
collections.<strong>deque</strong>([<em>iterable</em>[, <em>maxlen</em>]])
这一直保持不变 into Python 3.4。我认为将其设置为构造函数参数是从 2.6 开始的首选方法。他们无法在 2.x 系列中取消您的方法 - 直接设置属性,因为他们不想破坏向后兼容性。
对于 Python 3,没有这样的担忧,因此使用构造函数参数成为您唯一可以使用的方法。
旁注
与其用一个空列表初始化然后用用户提供的可说对象进行扩展,不如直接将可迭代对象传递给 collections.deque
?即
super(TailDeque, self).__init__(iterable, maxlen=maxlen)
如何将此代码从 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 = 最大长度
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)
如果不需要保持与Python2.5的兼容,可以简单一点:
super(TailDeque, self).__init__([], maxlen=maxlen)
动机
在Python 2.5中,collections.deque
的构造函数只有一个参数,iterable:
<strong>deque</strong>([<em>iterable</em>])
所以你必须在初始化对象后设置 maxlen。
在 Python 2.6 中,您可以提供 maxlen 作为可选参数:
collections.<strong>deque</strong>([<em>iterable</em>[, <em>maxlen</em>]])
这一直保持不变 into Python 3.4。我认为将其设置为构造函数参数是从 2.6 开始的首选方法。他们无法在 2.x 系列中取消您的方法 - 直接设置属性,因为他们不想破坏向后兼容性。
对于 Python 3,没有这样的担忧,因此使用构造函数参数成为您唯一可以使用的方法。
旁注
与其用一个空列表初始化然后用用户提供的可说对象进行扩展,不如直接将可迭代对象传递给 collections.deque
?即
super(TailDeque, self).__init__(iterable, maxlen=maxlen)