【问题标题】:Python: How can I set the default behaviour of NoneType objects?Python:如何设置 NoneType 对象的默认行为?
【发布时间】:2021-08-24 09:05:36
【问题描述】:

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

class DataSet(list):

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

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

>>> 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 值?

【问题讨论】:

    标签: python list nonetype built-in


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      你可以这样做。

      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] 之类的操作。

      【讨论】:

      • 你应该明确检查无...这将过滤掉 0
      • 对。更新了。
      • 使用i is not None获取更多惯用代码
      • 谢谢!更新了:)
      【解决方案3】:

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

      • __setattr__
      • __setitem__
      • append
      • extend
      • insert

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

      【讨论】:

        猜你喜欢
        • 2016-01-19
        • 2012-02-26
        • 1970-01-01
        • 2021-07-26
        • 2014-01-16
        • 2015-05-25
        • 2018-11-15
        • 2019-04-08
        • 1970-01-01
        相关资源
        最近更新 更多