gpt4 book ai didi

python - 可以将一个 dict.get() 嵌套在另一个内部,还是这种糟糕的设计?

转载 作者:行者123 更新时间:2023-12-01 12:04:47 26 4
gpt4 key购买 nike

因此,我正在处理一个代码库,其中字典包含一些关键信息。在开发过程中的某个时刻,其中一个键的名称发生了变化,但旧键在很多地方仍然存在。让我们调用键 newold 以供引用。

为了让它与旧版本兼容,我正在做类似的事情:

dict_name.get(new_key,dict_name.get(old_key,None))

这是糟糕的设计还是可以的?为什么/为什么不?

说明示例:(基于@Alexander 的输入)

有两个字典 d1 和 d2。

d1={k1:v1,old_key:some_value}
d2={k1:v1,new_key:some_value}

我现在正在设计的函数可以像字典一样获取 d1 或 d2 作为参数。我的函数应该能够获取 some_value,无论是否存在 old_key 或 new_key。

最佳答案

这是一个合理的方法。唯一的缺点是它会对两个键执行 get,这在大多数情况下不会影响性能。

我唯一的笔记是挑剔的:

  • dict 是保留字,所以不要把它当作变量使用
  • None 是默认值,因此可以为 old_key 删除它,例如:
info.get('a', info.get('b'))

回应“有没有办法防止双重调用?”:是的,存在几种合理的方法=)。

  1. 单行代码可能如下所示:

    info['a'] if 'a' in info else info.get('b')

    如果您的键较长,则开始变得难以阅读。

  2. 更详细的方法是将其扩展为完整的语句:

    val = None
    if 'a' in info:
    val = info['a']
    elif 'b' in info:
    val = info['b']
  3. 最后一个通用选项(默认在 *keys 之后)将仅适用于 python 3:

    def multiget(info, *keys, default=None):
    ''' Try multiple keys in order, or default if not present '''
    for k in keys:
    if k in info:
    return info[k]
    return default

    这会让你干净地解决多个调用,例如:

    option_1 = multiget(info, 'a', 'b')
    option_2 = multiget(info, 'x', 'y', 'z', default=10)

如果这在某种程度上是多个 api 版本的流行病或某种东西(?),您甚至可以包装 dict,尽管这可能有点矫枉过正:

>>> class MultiGetDict(dict):
... def multiget(self, *keys, default=None):
... for k in keys:
... if k in self:
... return self[k]
... return default
...
>>> d = MultiGetDict({1: 2})
>>> d.multiget(1)
2
>>> d.multiget(0, 1)
2
>>> d.multiget(0, 2)
>>> d.multiget(0, 2, default=3)
3

关于python - 可以将一个 dict.get() 嵌套在另一个内部,还是这种糟糕的设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58815940/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com