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 函数的默认行为设置为 abs
到 None
值?
没有。并且有充分的理由。其他代码可以依赖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/取消操作。
我创建了自己的 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 函数的默认行为设置为 abs
到 None
值?
没有。并且有充分的理由。其他代码可以依赖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/取消操作。