跳到内容

嵌套 min-max (PLW3301)

源自 Pylint 代码检查工具。

有时提供修复。

作用

检查嵌套的 minmax 调用。

为什么这不好?

嵌套的 minmax 调用可以被扁平化为单个调用以提高可读性。

示例

minimum = min(1, 2, min(3, 4, 5))
maximum = max(1, 2, max(3, 4, 5))
diff = maximum - minimum

建议改为

minimum = min(1, 2, 3, 4, 5)
maximum = max(1, 2, 3, 4, 5)
diff = maximum - minimum

已知问题

结果代码可能会更慢并使用更多内存,尤其是对于嵌套的可迭代对象。例如,此代码

iterable = range(3)
min(1, min(iterable))

将被修复为

iterable = range(3)
min(1, *iterable)

至少在当前版本的 CPython 上,这会在调用 min 之前为整个可迭代对象分配一个集合,并可能导致性能下降,至少对于大型可迭代对象。

修复安全性

此修复始终是不安全的,并且可能会更改程序的行为,对于没有完全等价关系的类型,例如涉及 NaN 的浮点数比较。

print(min(2.0, min(float("nan"), 1.0)))  # before fix: 2.0
print(min(2.0, float("nan"), 1.0))  # after fix: 1.0

print(max(1.0, max(float("nan"), 2.0)))  # before fix: 1.0
print(max(1.0, float("nan"), 2.0))  # after fix: 2.0

此修复还将删除外部调用中的任何注释。

参考