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函数编写自己的dictionary子类,该函数将可调用项作为第二个参数,并且只在需要时调用可调用项:

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, keys, 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)

最新更新