默认参数将在传递给my_dict.get 之前进行评估。这对于函数的调用方式是完全通用的(它们的参数必须在执行调用之前全部评估)。
get 的实现内部没有导致这种行为。
您可以使用惰性求值 getter 函数编写自己的字典子类,该函数将可调用对象作为其第二个参数,并且仅在需要时调用可调用对象:
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)