Изменения доступа к Google Vision Response в различных системах (с использованием Python)

Вопрос или проблема

Я использую API Google Vision для аннотаций текста, но почему в некоторых системах система принимает ответ response.full_text_annotation.pages от Google Vision, а в некоторых системах она принимает ответ response[“fullTextAnnotation”][“pages”] от Google Vision? Почему так? Из-за этого мне приходится постоянно изменять код, чтобы итерация происходила внутри ответа в разных системах.

for page in response["fullTextAnnotation"]["pages"]:
  for block in page["blocks"]:
     for paragraph in block["paragraphs"]:
        for word in paragraph["words"]:
           print(word)


->но в некоторых системах метод, который позволяет итерацию, такой

for text in response.full_text_annotation.pages:
   for block in text.blocks:
       for para in block.paragraphs:
          for word in para.words:
             print(word)

Ответ или решение

Проблема, с которой вы столкнулись при использовании Google Vision API, связана с различиями в том, как API может быть реализован в разных версиях библиотек или различными клиентами Python, которые работают с этим API. В частности, у вас есть две разные формы доступа к результатам аннотации текста: через словари и через объекты.

Причины различий

  1. Разные библиотеки и версии: Различные библиотеки, используемые для доступа к Google Vision API, могут иметь разные способы организации данных. Например, клиентская библиотека может быть обновлена, и в новой версии может быть реализован интерфейс для доступа к результатам через атрибуты объектов, а не через словари.

  2. Тип данных: Если response — это объект, имеющий доступ к атрибутам, то вы можете использовать доступ через response.full_text_annotation.pages. В случае response["fullTextAnnotation"]["pages"] вы работаете с обычным словарем Python, где доступ осуществляется через ключи.

Решение проблемы

Чтобы избежать необходимости менять код каждый раз в зависимости от того, как возвращается ответ, вы можете использовать условную проверку типа данных или же создать универсальную функцию, которая будет обрабатывать ответ в зависимости от его типа. Вот пример этого подхода:

def extract_text(response):
    # Проверка типа response
    if isinstance(response, dict) and "fullTextAnnotation" in response:
        pages = response["fullTextAnnotation"]["pages"]
    elif hasattr(response, 'full_text_annotation'):
        pages = response.full_text_annotation.pages
    else:
        raise ValueError("Неверный формат ответа от Google Vision API")

    for page in pages:
        for block in page.get("blocks", []):
            for paragraph in block.get("paragraphs", []):
                for word in paragraph.get("words", []):
                    print(word)

# Пример вызова функции
try:
    extract_text(response)
except ValueError as e:
    print(e)

Объяснение кода

  1. Проверка типа данных: Мы проверяем, является ли response словарем, и содержит ли он ключ fullTextAnnotation. Если это так, мы извлекаем страницы через словарь.

  2. Атрибуты объекта: Если response является объектом и имеет атрибут full_text_annotation, мы обращаемся к страницам через атрибуты объекта.

  3. Универсальность: Такой подход позволит вашему коду оставаться универсальным и избегать частых изменений при переносе на разные системы.

Заключение

Использование данной функции позволит вам избавиться от постоянных изменений кодовой базы в зависимости от формата возврата API и сделать ваш код более надежным и чистым.

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

Капча загружается...