Функция выполняет либо ключ есть, либо нет в dictionary.get в Python 2.7 - PullRequest
0 голосов
/ 30 октября 2018

Я работаю со словарями в Python и ищу значение, используя:

my_dictionary_object.get("key")

Как мы все знаем, если ключ отсутствует в словаре, он вернет None объект. Поэтому, чтобы сохранить лишнюю строку и сделать мой код более интересным, я пытаюсь:

def my_function():
    '''do some calculations'''
    return missing_value_from_dictionary 

Теперь вот самое интересное; когда я

my_dictionary_object.get("key", my_function())

он выполняет функцию независимо от того, отсутствует ключ или нет, поэтому я подумал, что давайте уберем скобки, и я сделал:

my_dictionary_object.get("key", my_function)

и (на всякий случай)

my_dictionary_object.get("key", lambda: my_function())

но тот, у кого нет лямбды, не выполнил (потому что он никогда не вызывался) То же самое произошло с тем, у кого лямбда.

TL; DR

Мой вопрос: почему выполняется функция, если в словаре присутствует ключ?

Это что-то, что я делаю неправильно или что-то мне здесь не хватает?

1 Ответ

0 голосов
/ 30 октября 2018

В: my_dictionary_object.get("key", my_function()) исполнение выглядит примерно так:

  • Оценить первый аргумент ("ключ")
  • Оцените второй аргумент, который является выражением: my_function(). Итак, давайте вызовем функцию и используем вместо нее возвращаемое значение. Очень похоже на: a = my_function(), python будет вызывать функцию и помещать возвращаемое значение на ее место.
  • Вызовите mydictionary_object.get(..) с двумя указанными выше аргументами.

Другими словами, dictionary.get("key", default) просто вернет 2-й аргумент, если ключ не существует. Если это лямбда, лямбда возвращается. Лямбда - это объект. Обратите внимание, что в .get("key", my_function()), my_function() технически не является вторым аргументом. Результирующее значение, возвращаемое в результате выполнения этой функции, является вторым аргументом, который, надеюсь, объясняет, где вы ошибаетесь.


То, что вы ищете, фактически захвачено в другом контейнере с именем defaultdict.

Что бы вы сделали:

from collections import defaultdict

my_dictionary_object = defaultdict(my_function)  # my_function should not take any argument.
my_dictionary_object["non-existing-key"]         # Magic happens, see below.

Что происходит, если ключ (= x) не существует, my_function вызывается без каких-либо аргументов, а в словарь добавляется значение, возвращаемое функцией для ключа (= x). Что-то вроде:

if "key" not in dictionary:
    dictionary["key"] = my_function()
    return dictionary["key"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...