Установите значение в 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) 
  • Какая лучшая быстрочитаемая книга Python?
  • Есть ли прямой подход к форматированию чисел в jinja2?
  • как сделать комбинацию пар на каждую строку
  • Как объявить словарь со встроенной функцией
  • Как преобразовать время в строку
  • «Просите прощения, а не разрешения» - объясните
  • Как служба разминки работает в движке Google для python?
  • Частота глобальных переменных в python?
  • Python генерирует все возможные строки длины n
  • python случайным образом сортирует элементы одинакового значения
  • Получение текущего времени с часовым поясом в python?
  • Python - лучший язык программирования в мире.