我应该返回一个空的dict而不是没有吗?

2024-10-01 04:58:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个当前返回Nonedict的方法。

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

调用方当前必须检查是否存在两个键,以确定返回了哪种对象。

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

因为result可以是None,所以我考虑返回一个空的dict,所以调用者不需要检查它。你怎么认为?

相比之下,在re模块中,调用match的结果可以导致None

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

但在本例中,m是一个对象实例。在我的例子中,我正在返回一个dict,它应该是空的或者有一些条目。


Tags: 对象方法inrenoneifmatcherror
3条回答

是的,我认为返回一个空的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'

在上面的代码中,checktest_none.get(x)抛出一个AttributeError result_none方法可能返回none。为了避免这种情况,我必须添加一个 附加检查,并可能将该行重写为: if test_none is not None and test_none.get('x')根本不需要 如果方法返回一个空dict。如示例所示,检查test_dict.get('x')工作正常,因为方法result_dict返回一个空dict

经过更多的思考,我认为返回空的dict可能更像是Python。一个好的经验法则可能是,如果编写返回容器的函数/方法,则始终返回空容器。这种行为的几个例子:

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

相反,如果您试图获得一个对象,那么除了返回None之外别无选择。所以我猜None就像单个对象的空容器!感谢KennyTM为我辩护

我不完全确定这段代码的上下文,但是我认为返回None表明存在某种错误,操作无法完成。返回空字典意味着成功,但没有符合添加到字典的条件的。

<>我来自一个完全不同的背景(C++游戏开发),所以把它当作值得的东西:

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

相关问题 更多 >