Python如何设置NoneType对象对abs等内置函数的默认处理行为
Python本身不支持全局修改abs这类内置函数对None值的默认处理逻辑,全局修改内置函数的行为还会污染运行环境,影响其他正常代码的运行,因此最优的通用方案是在你自定义的DataSet类中封装统一的元素处理逻辑,所有内置函数的适配逻辑都复用这套规则,无需每个方法重复编写None判断代码。
实现示例
首先封装统一的元素处理方法,所有内置函数对应的魔术方法都调用该方法完成逻辑复用:
class DataSet(list): def _process_element(self, op_func): # 统一处理逻辑:遇到None直接返回,非None执行传入的操作函数 res = [] for item in self: if item is None: res.append(None) continue res.append(op_func(item)) # 如果你希望返回结果也是DataSet实例而非普通list,改成 return DataSet(res) 即可 return res def __abs__(self): return self._process_element(abs) # 后续新增其他内置函数支持仅需新增对应魔术方法,无需重复写判空逻辑 def __neg__(self): # 支持负号运算:-dataset return self._process_element(lambda x: -x) def __float__(self): # 支持float()类型转换 return self._process_element(float)
效果测试
>>> dataset = DataSet([1, 2, 3, None, -1, -2, -3]) >>> abs(dataset) [1, 2, 3, None, 1, 2, 3] >>> -dataset [-1, -2, -3, None, 1, 2, 3]
如果需要支持的内置函数数量极多,还可以通过__getattr__实现魔术方法的动态分发,不过更推荐显式声明需要支持的方法,避免出现预期外的行为。
内容的提问来源于stack exchange,提问作者suitendaal
相关产品推荐
相关产品推荐

