我有一个字典,我想使用 .get() 方法检索一些值,如果键不存在,则应执行返回正确值的默认函数,但仅当键不存在时才应执行展示。
我尝试删除默认值并且它有效,那么为什么即使不使用该函数也会执行它?
SQL 查询不会返回任何内容,因为它只包含字典中尚未存在的值
def get_port():
def default():
cursor.execute("SELECT port FROM table WHERE server=%s LIMIT 1",(server_name,))
return cursor.fetchone()[0]
port = {
'server1': 2222,
'server2': 2223,
'server3': 2224
}
#print(port.get(server_name)) << Works
return port.get(server_name, default())
Run Code Online (Sandbox Code Playgroud)
错误:
返回cursor.fetchone()[0] TypeError:“NoneType”对象不可下标
我希望默认函数仅在密钥不存在时执行。
需要构建/评估的默认值的问题get是,即使不需要,也会执行代码,这可能会减慢代码速度,或者在您的情况下触发不必要的错误。
另一种选择可能是:
port.get(server_name) or default()
Run Code Online (Sandbox Code Playgroud)
如果由于未找到密钥而get返回,则已激活。但如果返回一些东西,它就会短路并且不会被调用。Noneor default()getdefault()
(如果get返回空字符串、零、任何“虚假”值,这可能会失败,但在你的情况下 - 服务器名称 - 我认为它不会发生)
另一种选择(这里可能有点过分)是使用一个collections.defaultdict对象
port = collections.defaultdict(default)
port.update({
'server1': 2222,
'server2': 2223,
'server3': 2224
})
Run Code Online (Sandbox Code Playgroud)
然后每次使用port[server]未知键调用该default函数并将结果存储在字典中。设为port全局或持久化,您就创建了一个不错的缓存:下次获取相同的值时,默认值已在字典中。