почему dict.get () не работает с другой функцией, установленной по умолчанию? - PullRequest
1 голос
/ 25 марта 2020

Ниже приведены 2 идентичные функции, но одна с помощью dict.get (), а другая - с помощью клавиши if в dict. 15, 30 и 45 он должен получить хэшированное значение, но вместо этого он возвращает значение по умолчанию - функция, даже если ключ уже находится в словаре?

D = dict()
def bugged(i):
    def nest():
        print('Not in D')
        div, mod = divmod(i, 5)
        D[i] = (div, mod)
        return div, mod
    print()
    print(i)
    print(i in D)
    return D.get(i, nest())


def works(i):
    def nest():
        print('Not in D')
        div, mod = divmod(i, 5)
        D[i] = (div, mod)
        return div, mod
    print()
    print(i)
    print(i in D)
    if i in D:
        return D[i]
    return nest()

f = works
f = bugged

for x in range (0,50,5):
    f(x)
print('='*100)
for x in range (0,50,3):
    f(x)

1 Ответ

4 голосов
/ 25 марта 2020

В Python аргументы оцениваются перед вызовом функции, поэтому в вашем случае nest () вызывается перед D.get. Поскольку гнездо изменяет D, D.get всегда возвращает значение, установленное в nest ().

Опуская операторы печати, ваша функция может быть выражена более кратко, используя метод dicde setdefault:

def func(i):
    return D.setdefault(i, divmod(i, 5))
...