子类Python list以验证新项

2024-03-28 11:56:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我想要一个python列表,它在外部表示为其内部列表项的平均值,但在其他方面表现为列表。如果添加了一个不能转换为浮点的项,它应该引发一个TypeError。在

我要做的是提高TypeError。对于通过任何列表方法添加的无效项,如.append.extend+=、按片设置等,都应该引发该值

是否有方法拦截添加到列表中的新项目并验证它们?

我尝试在__getattribute__中重新验证整个列表,但是当它被调用时,我只能访问旧版本的列表,而且它甚至不能被称为初始化、运算符+=,或者像{}这样的片。在

有什么想法吗?在


Tags: 项目方法列表运算符平均值浮点appendextend
3条回答

MutableSequence继承并实现它所需的方法以及不在序列范围内的任何其他方法——比如operators here。这将允许您在自动生成迭代器和包含功能的同时更改类似于列表的功能的运算符操作。在

如果你想检查切片,你需要在你的__getitem__(和/或__setitem__)方法中做isinstance(key, slice)。注意,像myList[0]这样的单个索引不是切片请求,而是单个索引,myList[:0]是实际的切片请求。在

array.array类将负责float部分:

class AverageList(array.array):
    def __new__(cls, *args, **kw):
        return array.array.__new__(cls, 'd')
    def __init__(self, values=()):
        self.extend(values)
    def __repr__(self):
        if not len(self): return 'Empty'
        return repr(math.fsum(self)/len(self))

还有一些测试:

^{pr2}$

实际上最好的答案可能是:不要

当所有对象被添加到列表中时,对它们进行检查将花费大量的计算成本。你做这些检查有什么好处?在我看来,你收获甚微,我建议你不要实施它。在

Python不检查类型,因此尝试对一个对象进行一点类型检查确实没有多大意义。在

相关问题 更多 >