2013-04-12 31 views
10

如果尚未设置数值,则最多pythonic如何在dict中设置值?只有在数值尚未设置的情况下,才能在字典中设置值

在我的代码使用if语句的时刻:

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

dict.get(key,default)是适当的代码消耗的字典,而不是正在准备字典传递给另一个函数的代码。你可以用它来设置的东西,但它没有漂亮IMO:

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

将评估即使字典包含关键的计算功能;错误。

默认值是当默认值相同时。

当然有很多次您设置不需要计算作为默认设置的主要价值,他们当然可以使用dict.setdefault。但是更复杂的案例呢?要做到这一点

+0

考虑ç把你的问题的标题挂在更精确的东西上:“如何设置默认kwarg值以传递给另一个函数”。我觉得这个标题太笼统了。 –

回答

7

这是一个有点不回答,但我要说的是最Python化的if语句,你拥有它。你抵制了用__setitem__或其他方法对其进行单线化的冲动。您已经避免了逻辑中可能存在的错误,这是因为当尝试巧妙地利用短语and/or黑客行为时可能发生的存在但错误的值。很明显,计算功能在没有必要时不会被使用。

它清晰,简洁,易读 - pythonic

2

一种方法是:

if key not in dict: 
    dict[key] = value 
+1

如上所述,[setdefault](https://docs.python.org/2/library/stdtypes.html#dict.setdefault)执行此操作。 – slaughter98

17

dict.setdefault将正好“仅在未设置值的情况下在字典中设置值”,这是您的问题。但是,您仍然需要计算将该值作为参数传递的值,这不是您想要的值。

+2

对未来的谷歌来说:这可能不是问题提出者想要的答案,但它是你想要的答案。 – CoreDumpError

+0

@CoreDumpError此评论应该是对许多流行的问题:) –

1

我用下面的修改kwargs非默认值,并传递到另一个功能:

def f(**non_default_kwargs): 

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

    f2(**kwargs) 

这样做的优点是

  • 你不必键入键两次

  • 在一个单一的功能

012完成
+1

我想你是假设太多的用例。 OP可能没有(或甚至不想)预先存在和预先计算的合理默认值集合。 – wim

-2

你可能需要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} 
+1

“将评估即使字典包含关键的计算功能;虫” – wim

+0

这是不是一个错误:'compute_default_timeout()'必须调用调用'dict.get()之前'凹口 - 可能不是什么OP想要,但这是正确的行为。 –

+0

引述来自的问题,所以很显然,该行为等同于一些东西,在OP已经考虑了错误(我不会称之为一个bug自己,但它仍然是不必要的和不希望的,这种情况下) – wim

-1

试试这个一个内胆:

connection_settings["timeout"] ||= compute_default_timeout(connection_settings) 
+0

这是哪个Python?在2.7中它说它的无效语法 – Will

+2

谢谢,这正是我所期待的!太优雅了! –

+1

谢谢,'SyntaxError'正是我一直在寻找的! – wim

相关问题