Python 's builtin min/max is evil

2017-11-14 19:53:37 +08:00
 workwonder

最近频繁被 Python 内建的 min 函数坑害,该函数接受两种调用方式: min(a, b, ...)min([a, b, ...]),然后加上其内部容错一点都没有,一不小心就跑挂了,比如参数中有 None,参数为空等 “意外” 情形。鉴于最近多次受灾,我实现了其安全替代: https://gist.github.com/wonderbeyond/fdd874f37d86534f23109f153cb671a2 (自带 doctest )

5952 次点击
所在节点    Python
65 条回复
widewing
2017-11-15 22:50:55 +08:00
确实挺 evil 的,连我 cpu 烧了这种简单的情况都不能自动处理😂
ryd994
2017-11-15 23:14:01 +08:00
如果出 none 说明你的代码有问题。语言没有义务给你擦屁股。如果 none 是允许的,你自己把 none filter 掉就好了。
要是给你把不该隐藏的隐藏了隐藏了,出 unexpected behavior,你是不是有可以骂一次?
Daetalus
2017-11-15 23:58:41 +08:00
@workwonder 这不是有没有普适性的问题,而是不应该把数据清理和数据处理的步骤混在一起。在你这个例子中,本质上你还是在真正的 min 和 max 前面加上了一个数据清理的步骤,然后调用 min 或 max。

数据到你这里还有 None,怎么看都是架构上出了问题。最明显的一个,就是你无法判断一个迭代器是否包含了一堆 None。

如果是正常的数据,直接迭代一次就能知道序列是否为空。你这种情况还要将迭代器转成列表,以此来判断每个值是否为 None。你自己说说是不是设计上哪里出问题了。

所以到了调用 min 和 max 的地步,数据中居然还可能为 None、[None]、含有 None 的迭代器,这些都是非常不靠谱的。建议加上一个数据清理的步骤,从逻辑上将两者分开。
dstwhk
2017-11-21 08:34:02 +08:00
装逼的人真是恶心,我说的就是你
装老外,干嘛正文和回复不用英文?
workwonder
2017-11-21 22:26:43 +08:00
@dstwhk 大家的观点都表达清楚了,这贴没啥好讨论得了,也已经沉底,你翻那么深觉得恶心能怪谁。

我在英文社区交流当然不会用中文,我不介意蹩脚的英文,我会尽力清晰表达自己的意思,欢迎围观: https://github.com/wonderbeyond

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/406388

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX