我有一个字典,我想从使用中检索一些值。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'对象不可下标
我希望默认函数只执行,如果键不存在。.
需要构建/评估的默认值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中的第一类对象。