Как проверить каждый ключ отдельно из списка в цикле без создания нескольких циклов. В которых может возникнуть 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})```
Вернуться на верх