如何解决dict.get始终检查默认值,即使没有必要
如果第一个参数已经产生返回值,为什么该方法必须验证可选参数(默认值)?
my_dict = {'subject': 'title'}
subject = my_dict.get('subject',my_dict['Subject'])
返回:“ KeyError:“主题””
或者,我将使用以下内容来解释键名的变化(在控件之外):
subject = my_dict['subject'] if 'subject' in my_dict else my_dict['Subject']
我很好奇为什么get()方法的行为方式如此。
解决方法
将在传递给my_dict.get
之前评估默认参数。这对于函数的调用方式是完全通用的(必须在执行调用之前对所有参数进行求值)。
get
的实现中没有 会导致这种行为。
您可以编写带有延迟求值getter函数的自定义字典子类,该函数将callable作为第二个参数,并且仅在需要时才调用callable:
class Dict(dict):
def lazy_get(self,key,func):
if key in self:
return self[key]
else:
return func()
my_dict = Dict({'subject': 'title'})
subject = my_dict.lazy_get('subject',lambda: my_dict['Subject'])
print(subject) # prints 'title'
subject2 = my_dict.lazy_get('foo',lambda: my_dict['subject'])
print(subject2) # also prints 'title'
在特定情况下,如果您有要尝试的按键列表,则可以改成这样:
class Dict(dict):
def get_from_keys(self,keys,default=None):
for key in keys:
if key in self:
return self[key]
return default
my_dict = Dict({'subject': 'title'})
subject = my_dict.get_from_keys(['subject','Subject'])
print(subject)
subject2 = my_dict.get_from_keys(['foo','subject'])
print(subject2)
当然,也没有什么可以说上述两个函数都必须是类方法。您可以使用普通字典和单独的独立函数:
def get_from_keys(dct,default=None):
for key in keys:
if key in dct:
return dct[key]
return default
my_dict = {'subject': 'title'}
subject = get_from_keys(my_dict,['subject','Subject'])
print(subject)
subject2 = get_from_keys(my_dict,['foo','subject'])
print(subject2)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。