Python 我应该返回一个空的dict而不是None吗?

Python 我应该返回一个空的dict而不是None吗?,python,Python,我有一个当前返回None或dict的方法 result,error = o.apply('grammar') 调用方当前必须检查是否存在两个键,以确定返回的对象类型 if 'imperial' in result: # yay elif 'west' in result: # yahoo else: # something wrong? 因为结果可以是None,所以我考虑返回一个空的dict,所以调用者不需要检查它。你觉得怎么样 为了进行比较,在re模块中,调用mat

我有一个当前返回
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应该是空的或者有一些条目。

经过仔细考虑,我认为返回一个空的
dict
可能更像python如果您编写了返回容器的函数/方法,那么一个好的经验法则可能是始终返回空容器。这种行为的几个例子:

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

相反,如果您试图获取单个对象,那么您别无选择,只能返回
None
。所以我猜
None
就像是单个对象的空容器!感谢KennyTM对我的解释:D

是的,我认为返回一个空的dict(或在适用的情况下返回一个空列表)比不返回任何dict更好,因为这样可以避免在客户端代码中进行额外检查

编辑: 添加一些代码示例以详细说明:

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'
在上面的代码中,check
test\u none.get(x)
抛出一个AttributeError作为 结果\u none方法可能返回none。为了避免这种情况,我必须添加一个 附加检查,并可能将该行改写为:
如果test\u none不是none,那么test\u none.get('x')
这根本不需要
如果该方法返回一个空的dict。如示例所示,check
test\u dict.get('x')
工作正常,因为该方法
result\u dict
返回一个空的dict。正如其他人所说,空的dict是错误的,因此没有问题。但是退回一张空的口授书的想法在我口中留下了一种不好的味道。我忍不住觉得返回一个空的dict可以隐藏返回
None
会暴露的错误。不过,这只是一种直觉。

我不能完全确定这段代码的上下文,但我要说,返回“无”表明存在某种错误,操作无法完成。返回一个空字典表示成功,但没有任何内容符合添加到字典的条件

我来自一个完全不同的背景(C++游戏开发),因此请接受以下内容:


但出于性能原因,最好不返回任何值,并节省创建空字典时可能涉及的任何开销(尽管开销很小)。我发现,一般来说,如果您使用的是脚本语言,那么您并不关心代码的性能。如果是的话,除非出于不可避免的原因,否则您可能不会用上述语言编写该功能。

.get
不会在此处“返回”一个
dict
。是的,默认情况下它会返回一个值或不返回任何值。@zeekay:不,我的意思是
{'a':1}.get('a')
返回
1
,而不是dict。另外,请注意
None.get('b'))
是一个错误,这表明不应在OP的代码中返回
None
{'a':{'b':1}。get('a')
将返回一个
dict
None
没有
get
方法,所以我看不到要点。我想说的是,很多东西返回
None
@zeekay:
。get
返回None,因为它还可以返回其他东西。在OP的问题中,除了None之外,唯一有效的返回值是dict。还有很多东西也会返回非非空值,例如,
”.split()=[]
“a.find(“b”)==-1
过滤器(lambda:False,[1,2])=[]
范围(1,-1)=[]
,等等。我同意。在这些情况下,唯一应该返回
None
的时间是需要传达的“无答案”以外的含义。您似乎忘记了从
result\u None
返回dict(尽管它不会真正影响示例的行为)。我更愿意返回一个空字典,除非
None
{}
实际上意味着不同的东西,在这种情况下,我可能会使用一个异常。实际上,我觉得
p.match
界面在这方面有点破损。我希望它返回一个
False
计算匹配对象,而不是
None
。如果遇到错误,我可能会抛出一个异常(而不是返回None)。我相信这就是蟒蛇的方式。