我应该返回一个空字典而不是None吗?

19 投票
5 回答
20353 浏览
提问于 2025-04-16 17:33

我有一个方法,现在返回的结果可能是 None 或者一个 dict(字典)。

result,error = o.apply('grammar')

调用这个方法的人现在需要检查返回的结果中是否有两个特定的键,才能判断返回的是什么类型的对象。

if 'imperial' in result:
    # yay
elif 'west' in result:
    # yahoo
else:
    # something wrong?

因为结果可能是 None,我在考虑直接返回一个空的字典,这样调用的人就不需要再检查这个情况了。你觉得怎么样?

为了比较,在 re 模块中,调用 match 方法的结果可能会是 None

p = re.compile('\w+')
m = p.match( 'whatever' )

但在这种情况下,m 是一个对象实例。而在我的情况下,我返回的是一个字典,这个字典要么是空的,要么里面有一些内容。

5 个回答

3

经过进一步思考,我觉得返回一个空的 dict(字典)可能更符合Python的风格。一个好的经验法则是,如果你写的函数或方法是用来返回一个容器的,最好总是返回一个空的容器。 这里有几个这样的例子:

"".split() == []
filter(lambda a:False, [1,2]) == []
range(1, -1) == []
re.findall('x', '') = []

相反,如果你是想获取一个单独的对象,那你就只能返回 None 了。我想 None 就像是单个对象的空容器!感谢KennyTM让我明白了这个道理 :D

5

我不太确定这段代码的具体情况,但我觉得返回None意味着出现了某种错误,操作没有完成。返回一个空字典则表示操作成功,但没有任何东西符合添加到字典的条件。

我来自一个完全不同的领域(C++游戏开发),所以你可以根据这个理解:

从性能的角度来看,返回None可能更好,这样可以节省创建一个空字典时可能产生的额外开销,虽然这个开销很小。一般来说,如果你在使用脚本语言,你可能不会太担心这段代码的性能。如果你真的在意性能,你可能不会在这种语言中写这个功能,除非有不可避免的原因。

23

是的,我觉得返回一个空字典(或者在适用的情况下返回一个空列表)比返回None要好,这样可以避免在使用代码时多做一次检查。

编辑:为了更清楚,我加了一些代码示例:

def result_none(choice):
    mydict = {}
    if choice == 'a':
        mydict['x']  = 100
        mydict['y']  = 1000
        return mydict
    else:
        return None

def result_dict(choice):
    mydict = {}
    if choice == 'a':
        mydict['x']  = 100
        mydict['y']  = 1000
    return mydict

test_dict = result_dict('b')
if test_dict.get('x'):
    print 'Got x'
else:
    print 'No x'

test_none = result_none('b')
if test_none.get('x'):
    print 'Got x'
else:
    print 'No x'

在上面的代码中,检查 test_none.get(x) 会抛出一个属性错误,因为result_none这个方法可能会返回None。为了避免这个错误,我必须加一个额外的检查,可能会把那行代码改成:if test_none is not None and test_none.get('x')。但如果这个方法返回的是一个空字典,那就完全不需要这样做。正如例子所示,检查 test_dict.get('x') 就没问题,因为方法 result_dict 返回的是一个空字典。

撰写回答