python - 函数返回不同类型是不好的做法吗?
问题描述
假设我们有一个检测 3 的倍数的函数:
t1 = (1, 2, 5)
t2 = (3, 6, 9)
def find3(t):
return [x for x in t if not x % 3] or None
我最初的想法是,没有在任何专业的编程环境中工作过,None
如果t1
传入,[3, 6, 9]
如果t2
传入,则返回。
但是,我看到很多人说函数应该总是返回相同的类型。这意味着返回[]
而不是None
.
不仅[]
更占用内存,而且看起来也不太清晰。如果我调用find3()
一个数据集并且没有倍数,我宁愿看到这个词而None
不是一个空列表,因为它更类似于现实生活中的语言。
是的,我知道如果find3()
在不同的位置使用结果,这可能会导致问题,但问题消失所需要的只是一个简单的if find3()
检查。那么为什么/最好[]
在所有情况下都返回?
解决方案
经验法则
给定某种搜索功能...
未能找到单个元素应返回None
;
当预期有许多元素时未能找到任何元素应该返回[]
。
解释
一些内置方法,例如re.search
returnNone
表示某种形式的否定或失败,在这种情况下意味着没有找到任何东西。
尽管在您的特定情况下,否定可以完美地用一个空列表表示,[]
因为它是虚假的,所以返回没有好处None
。
等同于 的列表re.search
,即re.findall
,正是这样做的。[]
不匹配时返回。
甚至有不返回的实际理由None
。考虑这段代码...
for x in find3([1, 2, 4]):
...
这将引发一个TypeError
违反直觉的问题,您必须通过撤消函数所做的来修复它。
for x in find3([1, 2, 4]) or []:
...
这表明返回None
比这里的任何事情都更痛苦。
推荐阅读
- c - C语言中的分段错误,广度优先搜索
- python - 如何使用 Python 抓取网络论坛
- cordova - 我无法运行 IONIC 3 项目。总是同样的错误
- php - 如何一次从redis获取多个键值
- google-ads-api - 谷歌广告 API。如何从购物绩效报告中获取 AdID
- sql - SQL:在日期范围内每月生成记录
- java - 将其存储为 URL 时,图像未从 SQLite 显示
- javascript - 克隆模型后,Backbone get set 抛出错误?
- typo3-8.x - Powermail (6.0.0) 中基于字符串的动态接收器
- jquery - jQuery 可排序 - 创建时