用最符合Python风格的方式再次调用一个函数,输入参数为另一种选择。

16 浏览
0 Comments

用最符合Python风格的方式再次调用一个函数,输入参数为另一种选择。

我正在开发一个查询数据库的软件。特别是,如果你使用特定的参数查询数据库,它找不到匹配的值,所以你应该使用不同的参数再次查询。\n下面是一个简短的脚本,概述了这个问题。`query_db`只是一个虚拟函数,用于模拟查询包含索引为`1`的条目的数据库的行为。在`get_db_params`函数中,我使用`a`参数查询数据库。如果返回`None`,那么我会尝试使用`b`参数再次查询。如果那也返回`None`,那么`get_db_params`会抛出一个错误。\n使用`d1`和`d2`作为参数调用`get_db_params`会返回\"some_value\",而使用`d3`会引发`KeyError`错误。\n我的问题是:这看起来不太像Python风格,尤其是连续有两个`if params is None:`。有没有改进这些函数的建议?\n

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)

0
0 Comments

问题的出现原因:

在上述代码中,函数"get_params"接受一个字典参数"d",并在字典"d"的键列表['a', 'b']中查找对应的值。然后,它使用这些值作为参数来查询数据库,并返回查询结果。如果在数据库中找不到这些参数,函数会引发一个"KeyError"异常。

然而,问题在于,如果在第一次查询中找不到参数,函数将不会尝试使用第二个参数再次查询数据库。这可能导致潜在的问题,因为可能存在一种情况,在第一个参数无法找到结果时,第二个参数可能会提供所需的结果。

解决方法:

为了解决这个问题,我们可以使用一个更加Pythonic(符合Python风格)的方法来重新调用函数,以使用备用输入进行查询。下面是一种解决方法:

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")

在这个解决方案中,我们使用了一个简单的循环来迭代键列表['a', 'b']。对于每个键,我们使用它来查询数据库,并检查查询结果是否不为空。如果结果不为空,我们立即返回结果。如果在循环结束后没有找到结果,我们引发一个"KeyError"异常。

这种解决方法的好处是,它允许我们在第一个参数没有找到结果时,尝试使用第二个参数进行查询。这样,我们可以更加灵活地处理不同的输入情况,并确保我们尽可能地获取所需的结果。

通过重新调用函数并使用备用输入进行查询,我们可以更加灵活地处理输入情况,并确保我们尽可能地获取所需的结果。这种方法遵循了Pythonic的原则,使代码更加简洁和易于理解。

0