从 Python 字典有条件地获取值的最佳实践

Kas*_*nen 5 python dictionary python-3.x

我在 python 中有一个非常标准结构的字典。如果存在,我想检索一个值,如果不检索另一个值。如果由于某种原因缺少两个值,我需要抛出一个错误。

字典示例:

# Data that has been modified
data_a = {
    "date_created": "2020-01-23T16:12:35+02:00",
    "date_modified": "2020-01-27T07:15:00+02:00"
}

# Data that has NOT been modified
data_b = {
    "date_created": "2020-01-23T16:12:35+02:00",
}
Run Code Online (Sandbox Code Playgroud)

这方面的最佳做法是什么?什么是一种直观且易于阅读的方法来做到这一点?

我目前这样做的方式:

mod_date_a = data_a.get('date_modified', data_a.get('date_created', False))
# mod_data_a = "2020-01-27T07:15:00+02:00"

mod_date_b = data_b.get('date_modified', data_b.get('date_created', False))
# mod_data_b = "2020-01-23T16:12:35+02:00"

if not mod_date_a or not mod_date_b:
    log.error('Some ERROR')
Run Code Online (Sandbox Code Playgroud)

这个嵌套get()看起来有点笨拙,所以我想知道是否有人有更好的解决方案。

dec*_*eze 6

如果你经常需要这个,为它编写一个函数是完全合理的:

def get_or_error(d, *keys):
    for k in keys:
        try:
            return d[k]
        except KeyError:
            pass
    else:
        raise KeyError(', '.join(keys))

print(get_or_error(data_a, 'date_modified', 'date_created'))
Run Code Online (Sandbox Code Playgroud)

  • …最起码到现在。一旦您发现自己再次输入相同的一行代码,请考虑使用函数。这实际上取决于您想要的“错误”。没有合理的单行语句也会记录或引发异常...... (2认同)

Bor*_*ris 5

value = data_a['date_modified' if 'date_modified' in data_a else 'date_created']
Run Code Online (Sandbox Code Playgroud)

  • 我发现它读起来有点重复和笨拙,但它肯定是一句单行话,也会引发一个“KeyError”。虽然“KeyError”可能会有点误导,因为它只提到第二个键,但这是一个小问题。 (2认同)

Kel*_*ndy 4

假设没有错误值并且您实际上不需要False但只是任何错误值:

mod_date_a = data_a.get('date_modified') or data_a.get('date_created')
Run Code Online (Sandbox Code Playgroud)