如何只允许列出Python中最大数量的项目

时间:2019-04-05 13:04:57

标签: python python-3.x python-2.7

我想为列表应用最大数量的项目,请确保该代码不允许附加到列表的函数添加超过3个项目。

追加到列表的功能:

    transactions = []

    def append_hash():
        transactions.append(hash)

如何不允许append_hash在列表中添加三个以上的哈希:transactions而又不删除任何以前的哈希?

3 个答案:

答案 0 :(得分:2)

根据定义,list具有任意大小。您将需要一种新类型。

class BoundedListFullError(RuntimeError):
    pass


class BoundedList:
    def __init__(self, max_size, x=None):
        if x is None:
            x = []
        self.values = []
        self.values.extend(x)
        self.max_size = max_size

    def append(self, x):
        if len(self.values) == self.max_size:
            raise BoundedListFullError(self.max_size)
        self.values.append(x)

    def extend(self, xs):
        if len(self.values) + len(xs) > self.max_size:
            raise BoundedListFullError(self.max_size)
        self.values.extend(xs)

答案 1 :(得分:1)

您可以仅继承list并修改append方法:


class MyStack(list):
    def __init__(self, max_size, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.max_size = max_size

    def append(self, value):
        if len(self) >= self.max_size:
            raise ValueError("NO!")
        # Per @chepner's suggestion
        super().append(value)

somestack = MyStack(3)
somestack.append(1)
somestack.append(2)
somestack.append(3)
somestack.append(4) # Raises ValueError

答案 2 :(得分:0)

如果您控制代码并确保仅使用函数:

transactions = []

def append_hash(h):
    transaction = (transactions + [h])[:3]

def append_hash(h):
    if len(transaction) < 3:
        transaction.append(3)
    # else:
    #    raise some error you need to choose/define 

尽管这两个都不会强制执行-您仍然可以在没有功能的情况下修改列表。您需要一个单独的类-请参见chepners answer

添加第四个哈希将无声地失败-如果您想引发异常,则可以采用第二个解决方案。