提问者:小点点

python字典。具有默认值的get()方法即使在不应该执行时也会引发异常


我有一个字典,我想从使用中检索一些值。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())

错误:

返回cursor.fetchone()[0]TypeError:'NoneType'对象不可下标

我希望默认函数只执行,如果键不存在。.


共3个答案

匿名用户

需要构建/评估的默认值get的问题在于,即使不需要,代码也会被执行,这会减慢代码的速度,或者在您的情况下会触发不必要的错误。

另一种选择是:

port.get(server_name) or default()

如果由于找不到键而get返回None,则激活或default()。但是如果get返回某个内容,它就会短路,并且不会调用default()

(如果get返回空字符串、零、任何“falsy”值,这可能会失败,但在您的情况下(服务器名称),我认为这不会发生)

匿名用户

您正在调用该函数,因此它确实被执行(默认()vs.默认)。(即使你没有调用它,即. get(...,默认),你也只能得到函数对象,这不符合你的目的。)

如果您只想在密钥不存在时调用它,那么您需要稍微详细一点——在这一点上,像这样重构是值得的:

ports = {
    "server1": 2222,
    "server2": 2223,
    "server3": 2224,
}


def get_port(server_name):
    port = ports.get(server_name)
    if not port:
        cursor.execute(
            "SELECT port FROM table WHERE server=%s LIMIT 1",
            (server_name,),
        )
        port = cursor.fetchone()[0]
    return port

匿名用户

前面的答案将为您当前的问题提供解决方案。

默认值()首先被计算。

我想包括一些更多的信息来帮助你理解正在发生的事情。这个问题可能看起来很天真,但它触及了Python的基本方面(实际上也是任何编程语言)。希望这会引起一些读者的兴趣。

第一个被误解的方面与急切的评价有关。Python是一个热切的评估者。这是一个围绕这个主题的好帖子。

然后,阅读get()方法本身——它返回一个值,该值可能是函数,因为函数是Python中的第一类对象。