假设connectionDetails是一个Python字典,那么像这样重构代码的最佳、最优雅、最“Python”的方式是什么呢?

if "host" in connectionDetails:
    host = connectionDetails["host"]
else:
    host = someDefaultValue

当前回答

你也可以像这样使用defaultdict:

from collections import defaultdict
a = defaultdict(lambda: "default", key="some_value")
a["blabla"] => "default"
a["key"] => "some_value"

你可以传递任何普通函数而不是lambda:

from collections import defaultdict
def a():
  return 4

b = defaultdict(a, key="some_value")
b['absent'] => 4
b['key'] => "some_value"

其他回答

您可以使用一个lamba函数作为一行程序。创建一个新对象connectionDetails2,可以像函数一样访问它…

connectionDetails2 = lambda k: connectionDetails[k] if k in connectionDetails.keys() else "DEFAULT"

现在使用

connectionDetails2(k)

而不是

connectionDetails[k]

如果k在键中,则返回字典值,否则返回"DEFAULT"

是这样的:

host = connectionDetails.get('host', someDefaultValue)

我相信所有这些答案都是可以的,但这表明没有“好”的方法来做到这一点。我一直使用字典而不是case语句,并添加一个默认子句,我只是调用以下函数:

def choose(choise, choises, default):
    """Choose a choice from the choises given
    """
    return choises[choise] if choise in choises else default

这样我就可以使用正常的字典,没有特殊的默认子句等。

对于多个不同的默认值,请尝试以下方法:

connectionDetails = { "host": "www.example.com" }
defaults = { "host": "127.0.0.1", "port": 8080 }

completeDetails = {}
completeDetails.update(defaults)
completeDetails.update(connectionDetails)
completeDetails["host"]  # ==> "www.example.com"
completeDetails["port"]  # ==> 8080

你也可以像这样使用defaultdict:

from collections import defaultdict
a = defaultdict(lambda: "default", key="some_value")
a["blabla"] => "default"
a["key"] => "some_value"

你可以传递任何普通函数而不是lambda:

from collections import defaultdict
def a():
  return 4

b = defaultdict(a, key="some_value")
b['absent'] => 4
b['key'] => "some_value"