Python: 如何设置 NoneType 对象的默认行为?

Python: How can I set the default behaviour of NoneType objects?

我创建了自己的 class,它继承自 python 的默认列表 class。下面是一个简化版本,其中包含 __abs__ 方法,因此我可以使用 python 的 abs 函数。

class DataSet(list):

    def __abs__(self):
        result = []
        for i in self:
            result.append(abs(i))
        return result

假设有一个 DataSet 有时包含一个 NoneType 值,例如

>>> dataset = DataSet([1, 2, 3, None, -1, -2, -3])

如果我想知道这个DataSet的绝对值,我使用函数

>>> abs_dataset = abs(dataset)

我想要得到的结果是

[1, 2, 3, None, 1, 2, 3]

但是因为数据集中有一个NoneType类型的值,所以我得到错误

TypeError: bad operand type for abs(): 'NoneType'

对于这种情况,可以通过修改 DataSet 的 __abs__ 函数并检查 DataSet 的各个元素中的 None 来修复,但在我的例子中,我有更多情况None 值可能会出现,我还想实现比 abs 更多的内置函数。 有没有一种方法可以将默认 python 函数的默认行为设置为 absNone 值?

没有。并且有充分的理由。其他代码可以依赖None类型行为。

您可以做的是在 DataSet 上提供方法,该方法提供没有 None 值的过滤列表,并将其用于您的方法。

你可以这样做。

class DataSet(list):

    def __abs__(self):
        # Here if i is 0 then it'll be 0. 
        # No need to check for `None`.
        return [abs(i) if i else i for i in self]

dataset = DataSet([1, 2, 3, None, -1, -2, -3])
print(abs(dataset))
# [1, 2, 3, None, 1, 2, 3]

编辑:
正如@juanpa.arrivillaga 所提到的,如果你想过滤 None 类型的元素,那么你可以在列表理解中做类似 [abs(i) for i in self if i is not None] 的事情。

您可以编辑这些方法以确保您的数据集中没有 None。

  • __setattr__
  • __setitem__
  • append
  • extend
  • insert

只需检查 None 覆盖它们,如果将值更改为 0/取消操作。