【问题标题】:attribute 'maxlen' of 'collections.deque' objects is not writable“collections.deque”对象的属性“maxlen”不可写
【发布时间】:2016-04-06 03:36:03
【问题描述】:
class TailDeque(collections.deque):
    '''Implementation of deque with limited maxlen support for Python 2.5.'''
    def __init__(self, iterable=None, maxlen=-1):
        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)
logQueue = TailDeque(maxlen=20)

有人可以解释一下并告诉我如何为 python 3.4 执行此操作吗?

我总是得到

AttributeError: attribute 'maxlen' of 'collections.deque' objects is not writable

https://docs.python.org/2/library/collections.html#deque-objects

【问题讨论】:

  • 为什么需要为 Python 3.4 执行此操作?您使用的代码是 Python 2.5 和 2.6 的反向移植,以后版本不需要。
  • 我正在使用 python 3.4,它抛出了 AttributeError: 'collections.deque' 对象的属性 'maxlen' 不可写
  • 这很清楚,但不是我问的。

标签: python python-3.x collections deque


【解决方案1】:

maxlen 参数在 2.6 和 3.0 中添加到 collections.deque。 (在 2.7 和 3.1 中添加了从参数设置的只读 maxlen 属性。)您发布的代码旨在作为 2.5 的部分替代品。对于 2.6+ 和 3.1+,您应该只使用 collections.deque 而不必为部分反向移植而烦恼。如果您正在编写支持 2.5 到 2.7 的代码,则应该在 2.5 上运行时将 collections.deque 替换为其包装器。类似的东西

import sys

major = sys.version[0:3]

if major >= '2.6':
    from collections import deque
elif major == '2.5':
    from myutils import TailDeque as deque
else:
    raise MyException('This app requires 2.5 or later.')

【讨论】:

    猜你喜欢
    • 2015-07-27
    • 2011-01-06
    • 2016-12-24
    • 1970-01-01
    • 2014-05-22
    • 2014-06-28
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    相关资源
    最近更新 更多