我的方法当前返回None
或dict
。
result,error = o.apply('grammar')
调用者当前必须检查是否存在两个键来决定返回什么类型的对象。
if 'imperial' in result:
# yay
elif 'west' in result:
# yahoo
else:
# something wrong?
因为结果可以是None
,我想要返回一个空的dict,所以调用者不需要检查它。你觉得怎么样?
为了进行比较,在re
模块中,调用match
的结果可能会导致None
。
p = re.compile('\w+')
m = p.match( 'whatever' )
但在这种情况下,m
是一个对象实例。在我的情况下,我将返回一个dict,它应该是空的或有一些条目。
答案 0 :(得分:18)
是的我认为返回空的dict(或适用的空列表)比返回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)
会抛出 AttributeError
result_none方法可能返回None。为了避免这种情况,我必须添加一个
额外检查并可能将该行重写为:
完全不需要的if test_none is not None and test_none.get('x')
如果该方法返回一个空的字典。如示例所示,检查test_dict.get('x')
正常,因为方法result_dict
返回空字典。
答案 1 :(得分:5)
我不完全确定此代码的上下文,但我会说返回None表示存在某种错误并且操作无法完成。返回一个空字典表示成功,但没有任何内容符合添加到字典中的标准。
我来自一个完全不同的背景(C ++游戏开发),所以请考虑它的价值:
出于性能原因,可能很高兴返回None并保存任何开销,尽管很小,但可能涉及创建空字典。我发现,通常情况下,如果您使用的是脚本语言,那么您并不关心该代码的性能。如果你是,你可能不会用所述语言编写该功能,除非出于某些不可避免的原因需要。
答案 2 :(得分:3)
经过深思熟虑,我认为返回一个空的dict
可能更像是Pythonic。 如果您编写一个返回容器的函数/方法,一个好的经验法则可能是总是返回一个空容器。这种行为的几个例子:
"".split() == []
filter(lambda a:False, [1,2]) == []
range(1, -1) == []
re.findall('x', '') = []
相反,如果你想要获得一个对象,你别无选择,只能返回None
我想。所以我猜None
就像单个对象的空容器!感谢KennyTM对我有所了解:D
答案 3 :(得分:2)
正如其他人所说的,一个空的字典是假的,所以那里没有问题。但回归空谜的想法在我的嘴里留下了不好的味道。我不禁觉得返回一个空的dict可以隐藏返回None
会显示的错误。不过,这只是一种直觉。