Как проверить каждый ключ отдельно из списка в цикле без создания нескольких циклов. В которых может возникнуть KeyError и т.д.
Я написал код, который принимает 9 ключей из API. Поля authors, isbn_one, isbn_two, thumbinail, page_count не всегда могут быть получены, и если какое-либо из них отсутствует, я бы хотел, чтобы оно было None. К сожалению, if, или даже вложенные, не работают. Потому что это приводит к большому количеству циклов. Я также пробовал try и except KeyError и т.д., потому что у каждого ключа своя ошибка, и неизвестно, какой из них присвоить none. Вот пример логики, когда фотография отсутствует:
th = result['volumeInfo'].get('imageLinks')
if th is not None:
book_exists_thumbinail = {
'thumbinail': result['volumeInfo']['imageLinks']['thumbnail']
}
dnew = {**book_data, **book_exists_thumbinail}
book_import.append(dnew)
else:
book_exists_thumbinail_n = {
'thumbinail': None
}
dnew_none = {**book_data, **book_exists_thumbinail_n}
book_import.append(dnew_none)
Когда я использую логику, вы знаете, что когда выполняется одно условие, например, для thumbinail, остальные даже не проверяются. Когда я использую try и except, все аналогично. В ключах также есть ISBN, но там есть список в словаре, и мне нужно использовать что-то вроде этого:
isbn_zer = result['volumeInfo']['industryIdentifiers']
dic = collections.defaultdict(list)
for d in isbn_zer:
for k, v in d.items():
dic[k].append(v)
Выходные данные: [{'type': 'ISBN_10', 'identifier': '8320717507'}, {'type': 'ISBN_13', 'identifier': '9788320717501'}]
Я уже не знаю, что использовать, чтобы проверить каждый ключ отдельно и в случае его отсутствия или отсутствия одного ISBN (идентификатора) присвоить значение None. Я уже перепробовал много идей.
Остальная часть кода:
book_import = []
if request.method == 'POST':
filter_ch = BookFilterForm(request.POST)
if filter_ch.is_valid():
cd = filter_ch.cleaned_data
filter_choice = cd['choose_v']
filter_search = cd['search']
search_url = "https://www.googleapis.com/books/v1/volumes?"
params = {
'q': '{}{}'.format(filter_choice, filter_search),
'key': settings.BOOK_DATA_API_KEY,
'maxResults': 2,
'printType': 'books'
}
r = requests.get(search_url, params=params)
results = r.json()['items']
for result in results:
book_data = {
'title': result['volumeInfo']['title'],
'authors': result['volumeInfo']['authors'][0],
'publish_date': result['volumeInfo']['publishedDate'],
'isbn_one': result['volumeInfo']['industryIdentifiers'][0]['identifier'],
'isbn_two': result['volumeInfo']['industryIdentifiers'][1]['identifier'],
'page_count': result['volumeInfo']['pageCount'],
'thumbnail': result['volumeInfo']['imageLinks']['thumbnail'],
'country': result['saleInfo']['country']
}
book_import.append(book_data)
else:
filter_ch = BookFilterForm()
return render(request, "BookApp/book_import.html", {'book_import': book_import,
'filter_ch': filter_ch})```