具有默认值的python dictionary.get()方法即使不应该执行异常,也会引发异常

2024-04-19 20:54:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字典,我想从使用.get()方法检索一些值,如果键不存在,应该执行一个默认函数,返回正确的值,但它应该只在键不存在时执行。你知道吗

我试着删除默认值,它的工作,那么为什么要执行的功能,即使它不会被使用?你知道吗

SQL查询将不返回任何内容,因为它只包含dict中尚未包含的值

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())

错误:

return cursor.fetchone()[0] TypeError: 'NoneType' object is not subscriptable

我希望默认函数仅在键不存在时执行。。你知道吗


Tags: 方法函数name功能default内容sqlget
3条回答

带有需要构建/求值的默认值的get的问题是,即使不需要,也会执行代码,这会减慢代码的速度,或者在您的情况下会触发不必要的错误。你知道吗

另一种选择是:

port.get(server_name) or default()

如果get因为找不到键而返回None,则or default()被激活。但是如果get返回某个东西,它就会短路,并且default()不会被调用。你知道吗

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

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

default() is being evaluated at first.

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

第一个被误解的方面与eager evaluation有关。Python是一个热心的评估者。Here is a nice post围绕主题。你知道吗

然后,阅读get()方法本身,它返回一个,这可能是一个函数,因为函数在Python中是first class objects。你知道吗

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

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

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

相关问题 更多 >