python - 如何使用 collections.deque 将此代码从 Python 2.5 移植到 3.4?

标签 python python-3.x python-2.5 python-collections

如何将此代码从 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.5collections.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)

关于python - 如何使用 collections.deque 将此代码从 Python 2.5 移植到 3.4?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35347103/

相关文章:

python - Interactive Brokers API (IBAPI) - 使用 threading.Timer 对象在数据连接断开时自动退出

python - 是什么阻止我的异步代码运行异步?

python - 方法解析顺序 (__mro__) 在 Python3.x 中不可用?

找不到Python模块(目录问题)

python - 获取 Pandas 组内满足条件的值的百分比

python - UDF 在 PySpark 中运行两次

python - Pi 计算器输出问题

python - 在列表中找到重新编译匹配项的最快方法

svn - SVN 1.6.6 的 Python 2.6 绑定(bind)

python - Pandas dataframe - 将某些行或单元格格式化为 2 d.p