Проверка наличия ключа и его значение не является пустой строкой в словаре Python
Существует ли лучшая практика для назначения переменной из пары ключ/значение в словаре Python:
- Если клавиша присутствует
- Если значение ключа не является пустой строкой
Иначе назначить значение по умолчанию для переменной.
Я хотел бы использовать dict.get
:
my_value = dict.get(key, my_default)
Но это присваивает пустой строке my_value
, если ключ присутствует, а значение - пустая строка. Лучше ли использовать следующее:
if key in dict and dict[key]:
my_value = dict[key]
else:
my_value = my_default
Это использовало бы правдивость пустой строки, чтобы гарантировать, что для my_value
были назначены только непустые строки.
Есть ли лучший способ выполнить эту проверку?
Ответы
Ответ 1
Возможно, вы имеете в виду что-то вроде:
a.get('foo',my_default) or my_default
который, как мне кажется, должен быть эквивалентен if-else
условному, у вас есть
например.
>>> a = {'foo':''}
>>> a.get('foo','bar') or 'bar'
'bar'
>>> a['foo'] = 'baz'
>>> a.get('foo','bar') or 'bar'
'baz'
>>> a.get('qux','bar') or 'bar'
'bar'
Преимущества этого по сравнению с другой версией довольно ясны. Это хорошо, потому что вам нужно только выполнить поиск один раз и потому, что or
коротких замыканий (как только он попадает в значение True
, оно возвращает его. Если True-подобного значения не найдено, or
возвращает второй).
Если ваше значение по умолчанию является функцией, его можно вызвать дважды, если вы напишете его как: d.get('foo',func()) or func()
. В этом случае вам лучше использовать временную переменную для хранения возвращаемого значения func
.
Ответ 2
Самый простой способ сделать то, что вы хотите:
my_value = dict.get(key) or my_default
or
будет выдавать первое значение, если оно оценивает не false, иначе второе. В отличие от других языков Python не заставляет результат быть логическим, довольно полезным свойством иногда.