具有默认值的 python 字典 .get() 方法即使不应该执行也会抛出异常

ma7*_*555 4 python python-3.x

我有一个字典,我想使用 .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”对象不可下标

我希望默认函数仅在密钥不存在时执行。

Jea*_*bre 7

需要构建/评估的默认值的问题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全局或持久化,您就创建了一个不错的缓存:下次获取相同的值时,默认值已在字典中。