Python中不推荐使用`return None`,如何绕过?

15 投票
4 回答
44682 浏览
提问于 2025-04-16 17:37

我有一个函数,它通过 httplib 连接到一个网址,并使用 lxml 来处理数据。这个函数会用 xpath 检查某种特定的模式,如果检查通过了,它就会返回一个字符串;但如果检查没有通过,它就什么都不返回。

现在的问题是,我的函数返回了 None。我调用这个函数后,会检查它返回的值是不是 not None,然后继续执行后面的代码。

举个例子:

def foobar(arg):
    # connect to page by httplib
    # check for arg in a certain pattern by lxml
    if check:
        return result
    else:
        return None

result = foobar(arg)
if result:
    # do stuff
else:
    # do other stuff

最近我看到有人说这样做是不好的做法。那么我该如何避免这种情况呢?

4 个回答

1

处理这个问题的方法有很多种,比如可以使用异常处理,或者直接返回你得到的结果,包括空字符串。这些方法都是可以的:

def foobar(arg):
    ...
    if check:
        return result

result = foobar(arg)
if result is not None:
    # do stuff
else:
    # do other stuff
2

我觉得返回 None 从用户体验的角度来看并不好,而不是说它的风格问题。正如在这个回答中简要提到的,考虑使用抛出异常来代替。例如:

def foobar(arg):
    # connect to page by httplib
    # check for arg in a certain pattern by lxml
    if not check:
        raise ValueError("arg did not match pattern in lxml")         
    return result

try:
    result = foobar(arg)
except ValueError:
    result = None

if result is not None:
    # do stuff
else:
    # do other stuff

这种方法的好处在于,它明确表示没有找到匹配的结果。其他使用你这个函数的人就不需要知道在没有匹配时会返回 None,他们可以根据自己的需要来处理这个异常。

45

返回 None 是完全没问题的。

在大多数情况下,你不需要特别去返回 None。Python 会自动帮你处理这个。下面是你原来的 foobar 的一个改版,它的表现和之前一样,但没有明确返回 None

def foobar(arg):
  if check:
    return result
# If not check, then None will be returned

不过,即使 Python 自动返回 None,明确写出来还是有好处的;这样你的代码会更容易阅读和理解。这是一个永恒的权衡,没有固定的答案。

撰写回答