【问题标题】:dict.get() always checks for the default value even if not necessary [duplicate]即使没有必要,dict.get() 也会始终检查默认值 [重复]
【发布时间】:2020-09-05 07:17:53
【问题描述】:

如果第一个参数已经产生了返回值,为什么方法必须验证可选(默认值)参数?

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() 方法的行为方式如此。

【问题讨论】:

  • 为了提高可读性,我更喜欢 dict.get() 方法。

标签: python dictionary get


【解决方案1】:

默认参数将在传递给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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    相关资源
    最近更新 更多