Вопрос или проблема
Я использую 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. В частности, у вас есть две разные формы доступа к результатам аннотации текста: через словари и через объекты.
Причины различий
-
Разные библиотеки и версии: Различные библиотеки, используемые для доступа к Google Vision API, могут иметь разные способы организации данных. Например, клиентская библиотека может быть обновлена, и в новой версии может быть реализован интерфейс для доступа к результатам через атрибуты объектов, а не через словари.
-
Тип данных: Если
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)
Объяснение кода
-
Проверка типа данных: Мы проверяем, является ли
response
словарем, и содержит ли он ключfullTextAnnotation
. Если это так, мы извлекаем страницы через словарь. -
Атрибуты объекта: Если
response
является объектом и имеет атрибутfull_text_annotation
, мы обращаемся к страницам через атрибуты объекта. -
Универсальность: Такой подход позволит вашему коду оставаться универсальным и избегать частых изменений при переносе на разные системы.
Заключение
Использование данной функции позволит вам избавиться от постоянных изменений кодовой базы в зависимости от формата возврата API и сделать ваш код более надежным и чистым.