Упростить проверку словаря: есть ли указанные ключи и не пустые значения

244 просмотра
0
0 Комментариев

Как можно упростить этот код?

В options должны быть данные ключи и они не должны быть пустыми. Слишком длинный if тоже не хочу писать, подскажите как это можно упростить?

try:
    if (not options['gatewayUrl']) or (not options['clientId']) or (not options['secretKey']):
        raise ConfigurationException('API connection data not set')
except KeyError:
    raise ConfigurationException('API connection data not set')


Добавить комментарий

2 Answers

Python Опубликовано 16.12.2018
0

Можно воспользоваться set.issubset():

chk = set(['gatewayUrl','clientId','secretKey'])
chk.issubset(set(options)) and all(options.values())

Примеры:

# значение для ключа "secretKey" не определено
 
In [178]: options = {'gatewayUrl':'url', 'clientId':'id', 'secretKey':None}
 
In [179]: chk.issubset(set(options)) and all(options.values())
Out[179]: False
 
# все OK
 
In [180]: options = {'gatewayUrl':'url', 'clientId':'id', 'secretKey':'secret'}
 
In [181]: chk.issubset(set(options)) and all(options.values())
Out[181]: True
 
# отутсвует ключ "secretKey"
 
In [182]: options = {'gatewayUrl':'url', 'clientId':'id'}
 
In [183]: chk.issubset(set(options)) and all(options.values())
Out[183]: False

Добавить комментарий
0

Используй метод get

keys = ['gatewayUrl', 'clientId', 'secretKey']
 
options = {'gatewayUrl': '1', 'clientId':'2', 'secretKey':'3'}
False in [bool(options.get(key)) for key in keys]
>> False
 
 
options = {'gatewayUrl': '1', 'clientId':'2', 'secretKey':''}
False in [bool(options.get(key)) for key in keys]
>> True
 
options = {'gatewayUrl': '1', 'clientId':'2'}
False in [bool(options.get(key)) for key in keys]
>> True

То есть проверку на ключ и его не пустое значение можно записать так:

if False in [bool(options.get(key)) for key in keys]:
    raise

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up