【发布时间】:2018-07-31 21:41:13
【问题描述】:
我正在开发一些查询数据库的软件。特别是,如果你用某个参数查询数据库,它不会找到匹配的值,所以你应该用不同的参数再次查询它。
以下是概述问题的简短脚本。 query_db 只是一个虚拟函数,旨在模仿对包含由1 索引的条目的数据库的查询行为。在get_db_params 函数中,我使用a 参数查询数据库。如果它返回None,那么我会使用b 参数再试一次。如果这也返回None,那么get_db_params 会引发错误。
使用d1 和d2 作为参数调用get_db_params 会返回“some_value”,而d3 会引发KeyError。
我的问题是:这似乎不是很pythonic,尤其是连续有两个if params is None:。关于如何改进这些功能的任何建议?
def query_db(x):
if x == 1:
return "some_value"
else:
return None
def get_params(d):
params = query_db(d['a'])
if params is None:
params = query_db(d['b'])
if params is None:
raise KeyError("Params not found in db")
return params
d1 = {'a': 1, 'b': 1}
d2 = {'a': 0, 'b': 1}
d3 = {'a': 0, 'b': 0}
params = get_params(d1)
params = get_params(d2)
params = get_params(d3)
【问题讨论】:
-
params = query_db(d['a']) or query_db(d['b']) -
@Chris_Rands:假设零或空字符串(或解析为
False的任何内容)在逻辑上与None相同。可能是,但你无法从问题中看出。 -
由于讨论了here 的原因,我希望避免使用
or。 -
这里你真正想要的是
params = query_db(d['a']) ?? query_db(d['b']),带有一个空合并??,而不是一个虚假合并or,正如……我认为PEP 531是当前版本讨论。我的印象是,大多数社区都认为好的用例很少见,不值得添加到语言中。您在这里肯定有一个用例,但随后从 2 个选项扩展到 3 个或动态列表,会使??无用和循环(如 David Maze 的回答)TOOWTDI,所以......也许大多数人是正确的。跨度> -
实际上,PEP 531 已被撤回,而更早的 PEP 505 已更新且未撤回,因此……请阅读 505,而不是 531。
标签: python