对于可能返回None的方法,哪种返回方式“更好”?

时间:2010-06-15 05:03:27

标签: python coding-style

我有一个方法,如果查找失败,将返回一个对象或None。以下哪种风格更好?

def get_foo(needle):
    haystack = object_dict()
    if needle not in haystack: return None
    return haystack[needle]

,或者

def get_foo(needle):
    haystack = object_dict()
    try:
        return haystack[needle]
    except KeyError:
        # Needle not found
        return None

我尚未决定哪个更适合自己。另一个选择是return haystack[needle] if needle in haystack else None,但我不确定那更好。

3 个答案:

答案 0 :(得分:10)

对于此特定示例,dict方法get看起来最简洁:

def get_foo(needle):
    haystack = object_dict()
    return haystack.get(needle)

一般来说,在Python中,人们倾向于先尝试/除了先检查一些内容 - 请参阅EAFP中的glossary条目。请注意,许多“成员资格测试”功能在幕后使用例外。

我不会就多重回报或替代方案的相对优点展开激烈的争论:)

答案 1 :(得分:2)

如果两者完全相同,选择你最喜欢的那个并且更具可读性 - 我喜欢第二个,但两者都很好。

(如果这比另一个更快,也许一个 - 所以如果表现真的重要,那么测试它并选择更快的那个)

答案 2 :(得分:-2)

我使用的每种语言都是第一个版本。例外情况基本上是伪装成许多相同的问题,所以如果我能避免它,我就不会使用它们。

还有可能的性能成本。我不了解Python,但是在许多其他语言中,创建异常的成本很高,你将在下一行中丢弃。