Если предположить, connectionDetails
что это словарь Python, какой самый лучший, самый элегантный, самый «питонный» способ рефакторинга кода, подобный этому?
if "host" in connectionDetails:
host = connectionDetails["host"]
else:
host = someDefaultValue
python
dictionary
coding-style
mnowotka
источник
источник
if/else
намного быстрее. Это может или не может играть роль.if/else
быстрее?Вы также можете использовать
defaultdict
так:Вы можете передать любую обычную функцию вместо лямбды:
источник
get
ни в подобные методы.Хотя
.get()
это хорошая идиома, она медленнее, чемif/else
(и медленнее, чемtry/except
если бы большую часть времени можно было ожидать присутствия ключа в словаре):источник
if/then
будет быстрее. В обоих случаях требуется поиск по словарю, и если вызовget()
не так много медленнее, чем остальные счета для замедления?O(1)
в словаре не зависит от размера словаря, поэтому издержки вызова функции актуальны.Для нескольких различных значений по умолчанию попробуйте это:
источник
None
указано значение empty или строка в качестве одного из значений в парах ключ-значение. Вdefaults
словаре может быть непреднамеренно пропущено одно из его значений. (см. также stackoverflow.com/questions/6354436 )В словарях python есть метод для этого:
dict.setdefault
Однако этот метод устанавливает значение
connectionDetails['host']
дляsomeDefaultValue
если ключhost
еще не задан, в отличие от того, что задан вопрос.источник
setdefault()
возвращает значение, так что это работает , а также:host = connectionDetails.setdefault('host', someDefaultValue)
. Просто помните, что он установитconnectionDetails['host']
значение по умолчанию, если ключ не был там раньше.(это поздний ответ)
Альтернативой является создание подкласса
dict
класса и реализация__missing__()
метода следующим образом:Примеры:
источник
Проверяя подозрение @Tim Pietzcker'а о ситуации в PyPy (5.2.0-alpha0) для Python 3.3.5, я обнаружил, что действительно оба
.get()
иif
/else
way работают одинаково. На самом деле кажется, что в случае if / else есть даже только один поиск, если условие и присваивание включают один и тот же ключ (сравните с последним случаем, когда есть два поиска).источник
Вы можете использовать функцию lamba для этого в качестве однострочника. Создайте новый объект,
connectionDetails2
доступ к которому осуществляется как функция ...Сейчас использую
вместо того
который возвращает значение словаря, если
k
находится в ключах, в противном случае он возвращает"DEFAULT"
источник