Python中不推荐使用`return None`,如何绕过?
我有一个函数,它通过 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
,明确写出来还是有好处的;这样你的代码会更容易阅读和理解。这是一个永恒的权衡,没有固定的答案。