14

如果尚未设置值,那么在 a 中设置值的最Pythonic方法是什么?dict

目前我的代码使用 if 语句:

if "timeout" not in connection_settings:
    connection_settings["timeout"] = compute_default_timeout(connection_settings)

dict.get(key,default)适用于使用 dict 的代码,不适用于准备将 dict 传递给另一个函数的代码。你可以用它来设置一些东西,但它并不漂亮:

connection_settings["timeout"] = connection_settings.get("timeout", \
    compute_default_timeout(connection_settings))

即使字典包含密钥,也会评估计算函数;漏洞。

Defaultdict 是默认值相同时。

当然,很多时候你将不需要计算的原始值设置为默认值,它们当然可以使用dict.setdefault. 但是更复杂的情况呢?

4

8 回答 8

36

dict.setdefault将精确地“仅在尚未设置值的情况下在 dict 中设置值”。

您仍然需要计算值以将其作为参数传递:

connection_settings.setdefault("timeout", compute_default_timeout(connection_settings))
于 2013-04-12T07:15:59.910 回答
12

这有点无法回答,但我想说最pythonic的是你拥有的if语句。你抵制了用单线__setitem__或其他方法对其进行处理的冲动。由于现有但错误的值,您已经避免了逻辑中可能出现的错误,这些错误可能在尝试巧妙地使用短路and/or黑客攻击时发生。很明显,不需要时不会使用计算功能。

它清晰、简洁、易读 - pythonic

于 2013-04-12T07:10:36.250 回答
4

One way to do this is:

if key not in dict:
  dict[key] = value
于 2013-04-12T07:09:07.060 回答
2

Python 3.9开始,您可以使用合并运算符 |来合并两个字典。右边的 dict 优先:

d = { key: value } | d

注意:这会创建一个包含更新值的新字典。

于 2020-03-13T10:47:14.930 回答
0

我正在使用以下内容将 kwargs 修改为非默认值并传递给另一个函数:

def f( **non_default_kwargs ):

    kwargs = {
        'a':1,
        'b':2,
    }
    kwargs.update( non_default_kwargs )

    f2( **kwargs )

这具有以下优点

  • 您不必键入两次密钥

  • 一切都在一个函数中完成

于 2013-04-12T07:16:38.630 回答
0

您可能需要dict.setdefault

创建一个新字典并设置一个值:

>>> d = {}
>>> d.setdefault('timeout', 120)
120
>>> d
{'timeout': 120}

如果已经设置了一个值,dict.setdefault则不会覆盖它:

>>> d['port']=8080
>>> d.setdefault('port', 8888)
8080
>>> d
{'port': 8080, 'timeout': 120}
于 2013-04-12T07:21:25.527 回答
0

@Rotareti 的回答让我想知道对于旧版本的 Python 3.9,我们是否可以这样做:

>>> dict_a = {'a': 1 }
>>> dict_a = {'a': 3, 'b': 2, **dict_a}
>>> dict_a

{'a': 1, 'b': 2}

(嗯,它在 Python3.7 上肯定可以工作,但是这种 Pythonesque 够吗?)

于 2021-07-11T13:30:01.913 回答
-1

.get()我发现利用 dict方法的返回值None(Falsy)既方便又明显,并且or如果密钥不存在,则推迟对昂贵的网络请求的评估。

d = dict()

def fetch_and_set(d, key):
    d[key] = ("expensive operation to fetch key")
    if not d[key]:
        raise Exception("could not get value")
    return d[key]

...

value = d.get(key) or fetch_and_set(d, key)

具体而言,就我而言,我正在从缓存中构建一个fn()字典,然后在加快调用后更新缓存。

这是我使用的简化视图

j = load(database)  # dict
d = dict()

# see if desired keys are in the cache, else fetch
for key in keys:
    d[key] = j.get(key) or fetch(key, network_token)

fn(d)  # use d for something useful

j.update(d)  # update database with new values (if any)
于 2018-06-15T22:51:27.673 回答