我有一个字典,我想从使用.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
我希望默认函数仅在键不存在时执行。。你知道吗
带有需要构建/求值的默认值的
get
的问题是,即使不需要,也会执行代码,这会减慢代码的速度,或者在您的情况下会触发不必要的错误。你知道吗另一种选择是:
如果
get
因为找不到键而返回None
,则or default()
被激活。但是如果get
返回某个东西,它就会短路,并且default()
不会被调用。你知道吗(如果
get
返回空字符串、零、任何“falsy”值,则此操作可能会失败,但在您的情况下-服务器名称-我认为它不会发生)前面的答案将为您当前的问题提供解决方案。你知道吗
我想包括一些更多的信息,以帮助你了解正在发生的事情。这个问题看起来很幼稚,但它涉及到Python的基本方面(实际上是任何编程语言)。希望这能引起一些读者的兴趣。你知道吗
第一个被误解的方面与eager evaluation有关。Python是一个热心的评估者。Here is a nice post围绕主题。你知道吗
然后,阅读get()方法本身,它返回一个值,这可能是一个函数,因为函数在Python中是first class objects。你知道吗
您正在调用函数,因此它确实会被执行(
default()
与default
)。(即使您没有调用它,即.get(..., default)
,您也只会得到function对象,这不符合您的目的。)如果您只想在键不存在的情况下调用它,那么您需要稍微详细一点—在这一点上,像这样重构是值得的:
相关问题 更多 >
编程相关推荐