首页 > 解决方案 > 函数返回不同类型是不好的做法吗?

问题描述

假设我们有一个检测 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()检查。那么为什么/最好[]在所有情况下都返回?

标签: pythonfunction

解决方案


经验法则

给定某种搜索功能...

未能找到单个元素应返回None

当预期有许多元素时未能找到任何元素应该返回[]

解释

一些内置方法,例如re.searchreturnNone表示某种形式的否定或失败,在这种情况下意味着没有找到任何东西

尽管在您的特定情况下,否定可以完美地用一个空列表表示,[]因为它是虚假的,所以返回没有好处None

等同于 的列表re.search,即re.findall,正是这样做的。[]不匹配时返回。

甚至有不返回的实际理由None。考虑这段代码...

for x in find3([1, 2, 4]):
    ...

这将引发一个TypeError违反直觉的问题,您必须通过撤消函数所做的来修复它。

for x in find3([1, 2, 4]) or []:
    ...

这表明返回None比这里的任何事情都更痛苦。


推荐阅读