Установите значение в dict, только если значение еще не установлено

Какой самый питонический способ установить значение в dict если значение еще не установлено?

В настоящий момент мой код использует выражения if:

 if "timeout" not in connection_settings: connection_settings["timeout"] = compute_default_timeout(connection_settings) 

dict.get(key,default) подходит для кода, потребляющего dict, а не для кода, который готовит dict для передачи другой функции. Вы можете использовать его, чтобы установить что-то, но не более красивое imo:

 connection_settings["timeout"] = connection_settings.get("timeout", \ compute_default_timeout(connection_settings)) 

будет оценивать вычислительную функцию, даже если ключ содержал ключ; ошибка.

Defaultdict – когда значения по умолчанию одинаковы.

Конечно, много раз вы устанавливаете примитивные значения, которые не требуют вычислений в качестве значений по умолчанию, и они могут, конечно, использовать dict.setdefault . Но как насчет более сложных случаев?

5 Solutions collect form web for “Установите значение в dict, только если значение еще не установлено”

Это немного не ответ, но я бы сказал, что самый pythonic – это оператор if, который у вас есть. Вы сопротивлялись стремлению к одному слою с помощью __setitem__ или других методов. Вы избегали возможных ошибок в логике из-за существующих, но-ложных значений, которые могут возникнуть при попытке быть умными при коротком замыкании and / or взломах. Сразу видно, что функция вычисления не используется, когда она не нужна.

Это понятно, красно и понятно – питоновское .

dict.setdefault будет точно «установить значение в dict, только если значение еще не установлено», это ваш вопрос. Однако вам все равно нужно вычислить значение, чтобы передать его в качестве параметра, который не является тем, что вы хотите.

Один из способов сделать это:

 if key not in dict: dict[key] = value 

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

 def f( **non_default_kwargs ): kwargs = { 'a':1, 'b':2, } kwargs.update( non_default_kwargs ) f2( **kwargs ) 

Это имеет достоинства, которые

  • вам не нужно набирать ключи дважды

  • все выполняется в одной функции

Попробуйте этот один вкладыш:

 connection_settings["timeout"] ||= compute_default_timeout(connection_settings) 
  • Чтение выхода клона git в режиме реального времени
  • Как построить вычислительно интенсивный веб-сервис?
  • Python: generic webbrowser.get (). Open () для chrome.exe не работает
  • Как удалить все escape-последовательности из списка строк?
  • Сумма целых чисел от 1 до n
  • Определить параметр запроса в app.yaml в приложении Google Appengine
  • Список карт по частичной функции vs lambda
  • Python: чтение части текстового файла
  • Python - лучший язык программирования в мире.