【问题标题】:Most pythonic way to call a function again with alternative input使用替代输入再次调用函数的大多数 Pythonic 方式
【发布时间】:2018-07-31 21:41:13
【问题描述】:

我正在开发一些查询数据库的软件。特别是,如果你用某个参数查询数据库,它不会找到匹配的值,所以你应该用不同的参数再次查询它。

以下是概述问题的简短脚本。 query_db 只是一个虚拟函数,旨在模仿对包含由1 索引的条目的数据库的查询行为。在get_db_params 函数中,我使用a 参数查询数据库。如果它返回None,那么我会使用b 参数再试一次。如果这也返回None,那么get_db_params 会引发错误。

使用d1d2 作为参数调用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


【解决方案1】:

我认为你最初写的很好。

另一种可能有效的公式:

def get_params(d):
    for k in ['a', 'b']:
        params = query_db(d[k])
        if params is not None:
            return params
    raise KeyError("Params not found in db")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-30
    • 2012-08-26
    • 2011-03-09
    • 1970-01-01
    • 2011-03-23
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多