我有一个搜索查询结果的函数。如果没有结果建议返回,False或None?
我认为它并不重要,但我想遵循最佳做法。
答案 0 :(得分:3)
在这种情况下,正面结果将是一个短字符串。
假设你有类似的东西(非常简单)......
the_things = {'foo', 'bar'}
def find_the_thing(the_thing):
if the_thing in the_things:
return the_thing
...如果找不到东西,它会默认返回None
,这没关系,你可以像这样使用它......
the_thing = find_the_thing('blah')
if the_thing is not None:
do_something_with(the_thing)
else:
do_something_else()
...但有时候提出像这样的例外更好......
the_things = {'foo', 'bar'}
def find_the_thing(the_thing):
if the_thing in the_things:
return the_thing
raise KeyError(the_thing)
......你可以像这样使用......
try:
do_something_with(find_the_thing('blah'))
except KeyError:
do_something_else()
......可能更具可读性。
答案 1 :(得分:1)
我会返回一个空列表,当你看到这个函数的返回值时,它会让你头疼。
如果你希望你的程序在假设列表中有元素时死掉,那么None是个不错的选择。
答案 2 :(得分:1)
我肯定不会返回False
。但除了None
与False
之外还有其他选择。
在这种情况下,正面结果将是一个短字符串。
因此,否定结果可能是空字符串。 (当然,除非这也是可能的积极结果。)
正如PEP 8所说:
对于序列,(字符串,列表,元组),请使用空序列为假的事实。
但这不是你问题的完整答案(首先也不是一个铁腕规则)。你必须考虑利弊,并决定哪些在你的实际使用中最重要。
我认为最大的问题是:如果您返回''
,尝试将结果用作字符串的代码将起作用。如果您返回None
,则相同的代码将引发异常。
例如,这里是我所说的一些代码的简化版本:
result = query_function(foo, bar)
soup = bs4.BeautifulSoup(result)
for div in soup.find_all('div'):
print(div['id'])
我的query_function
返回''
,因此代码将成功打印出无ID。这就是我想要的脚本。但对于不同的用例,提出异常可能更好。在这种情况下,我会query_function
返回None
。
或者,当然,您可以让query_function
本身引发异常,就像Aya的回答一样。
您可能希望查看标准字符串方法,re
方法以及stdlib中的其他搜索函数(甚至可以查看sqlite
等)以查看它们的作用。 (请注意,在少数情况下,有一对匹配的值返回和异常提升函数,如str.find
和str.index
,因此答案可能不是一个或另一个,而是两者。 )
答案 3 :(得分:0)
如果没有返回任何东西,只能逐一产生结果呢?生成器通常是一个方便的东西,因为它们避免构建列表,然后逐个使用和丢弃。