Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有默认值的python dictionary.get()方法即使在不应该执行时也会抛出异常_Python_Python 3.x - Fatal编程技术网

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

具有默认值的python dictionary.get()方法即使在不应该执行时也会抛出异常,python,python-3.x,Python,Python 3.x,我有一个字典,我想使用.get方法检索一些值,如果该键不存在,则应执行一个默认函数,返回正确的值,但仅当该键不存在时才应执行该函数 我尝试删除默认值,但它仍然有效,那么为什么即使不使用该函数,也会执行该函数呢 SQL查询将不返回任何内容,因为它只包含dict中尚未包含的值 def get_端口: def默认值: cursor.executes从表中选择端口,其中服务器=%s限制1,服务器\u名称, 返回cursor.fetchone[0] 端口={ “服务器1”:2222, “服务器2”:222

我有一个字典,我想使用.get方法检索一些值,如果该键不存在,则应执行一个默认函数,返回正确的值,但仅当该键不存在时才应执行该函数

我尝试删除默认值,但它仍然有效,那么为什么即使不使用该函数,也会执行该函数呢

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

def get_端口: def默认值: cursor.executes从表中选择端口,其中服务器=%s限制1,服务器\u名称, 返回cursor.fetchone[0] 端口={ “服务器1”:2222, “服务器2”:2223, “服务器3”:2224 }
printport.getserver_name您正在调用该函数,因此与默认值相比,它的执行是默认的。即使您没有调用它,也就是说,默认情况下,您只需要返回函数对象,这不符合您的目的

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

端口={ 服务器1:2222, 伺服器2:2223, 伺服器3:2224, } def get_端口服务器名称: port=ports.getserver\u名称 如果不是端口: cursor.execute 从服务器=%s限制为1的表中选择端口, 服务器名称,, port=cursor.fetchone[0] 返回端口 get的默认值需要构建/评估,其问题是执行代码(即使不需要),这会减慢代码的速度,或者在您的情况下会触发不必要的错误

另一种选择是:

port.get(server_name) or default()
如果get因为找不到键而返回None,则会激活or default。但如果get返回某个内容,它就会短路,并且不会调用default


如果返回空字符串、零或任何错误值,则此操作可能会失败,但在您的情况下(服务器名称),我认为这不会发生。

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

默认值首先被评估

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

第一个被误解的方面是关于。Python是一个热心的计算器。围绕主题


然后,阅读方法本身-它返回一个值,该值可能是函数,因为函数是Python中的。

因此,如果我使用默认值而不是默认值,我只会在找不到键时获取函数对象?正是如此。由于Python的求值顺序,在调用get函数之前,它需要知道用什么参数来调用它。所以它首先计算参数。因为secod参数是默认的,所以函数实际上是在那一刻被调用的。这就是原因,答案就在下面: