Речь в статье пойдет о специальных инструментах для работы с GraphQL на Python в качестве клиента. Если вы используете GraphQL в своих сервисах на Python, то, скорее всего, сталкивались с необходимостью писать и хранить строки, содержащие GraphQL запросы, а так же писать Python классы для хранения результатов этих запросов. Вероятнее всего, вам было неудобно: не хотелось дублировать схожие запросы, постоянно править классы при частом изменении схемы и т.п. Вот и мне тоже. Поэтому, решая описанные проблемы, появились на свет два пакета: graphql-query и graphql2python. Почти все популярные GraphQL клиенты на Python (https://graphql.org/code/#python-client) предлагают писать запросы в виде строк, т.е. не предоставляют инструменты для генерации валидных запросов из классов. Поэтому для их использования необходимо писать свои шаблоны, которые создают строки запросов из фрагментов, общих параметров и т.п. graphql-query -- это набор специальных классов, реализующих объекты GraphQL запросов (https://graphql.org/learn/queries/) с методами render, которые генерируют результирующую строку с запросом на основе созданных шаблонов. В качестве шаблонов исользуется классический пакет jinja2. Подробная документация graphql-query доступна по ссылке https://denisart.github.io/graphql-query/. В данной статье разберем как реализовать несколько примеров запросов из официальной документации GraphQL. Для быстрой демонстрации посмотрим как создать очень короткий и простой запрос. Такой запрос в документации выглядит так Реализовать его на graphql-query можно следующим образом Метод render для объекта graphql_query.Operation как раз возвращает финальную строку с запросом. Внутри массива fields объекта graphql_query.Query можно передавать строки (имена полей); объекты graphql_query.Field; фрагменты и встроенные фрагменты (Inline Fragments); Рассмотри запрос, который содержит переменные (Variables), аргументы (Arguments) и фрагменты (Fragments): Это хороший пример для демонстрации, так как содержит два запроса (вместе с алиасами) и аргументы полей. Код на graphql-query для данного запроса выглядит так Ясно, что для запросов leftComparison и rightComparison можно создать отдельную функцию и избежать дублирования кода Остальные примеры можно посмотреть в документации: директивы, __typename и др. Есть два хороших примера софта, который генерирует модель по схемам graphql code generator на TypeScript; datamodel-code-generator на python для генерации модели из openapi. graphql2python -- схожий инструмент, который генерирует pydantic классы из GraphQL схемы. Документация этого пакета доступна по ссылке https://denisart.github.io/graphql2python/. Рассмотрим несколько примеров. После установки graphql2python c помощью pip достаточно выполнить команду где  graphql2python.yaml - это ваш файл с конфигурацией. В самом простом виде этот файл может выглядеть так Подробное описание конфигурации доступно на гравной странице документации. Запуск приведенной выше команды создат (или перезапишет) файл ./output.py, в котором будет сгенерированный код на python.  Если определить в GraphQL схеме кастомные скаляры то на выходе мы получим Для стандартных GraphQL скаляров комментарии будут взяты из graphql-core. По умолчанию все результирующие типы будут str. Это легко исправить с помощью конфига. Для мы получаем Не стандартные типы python пока недоступны. Это будет исправлено в ближайших релизах, когда будут добавлены кастомные импорты, кастомные шаблоны. Для рендеринга GraphQL Enum и GraphQL Union используются enum.Enum и typing.Union соответственно. Вот пример Для такой схемы (определение типов Human, Droid и Starship опущено) мы получаем следующий результат Объект typing.Union не может содержать один элемент. В таком случае мы получим В этих примерах _t есть сокращение от typing, т.е. Рассмотрим тренировочную схему из https://countries.trevorblades.com/ и запустим для нее генерацию со следующим конфигом Мы получим следующий выходной файл Изменение базового класса GraphQLBaseModel пока недоступно. Это планируется исправить в грядущих релизах. Блок нужен для того, чтобы pydantic мог правильно работать с полямя, имеющими тип, совпадающий с самим объектом (https://docs.pydantic.dev/usage/postponed_annotations/). Функционал graphql2python был в первую очередь сделан для рабочих нужд. В грядущих релизах graphql2python планируется расширить возможность настраивать выходной файл с моделью. В планах кастомные импорты; кастомные шаблоны (например, если вы хотите использовать не pydantic, а https://github.com/lidatong/dataclasses-json); алиасы не только для полей, но и для произвольных объектов; добавить рендер InputObjectType; загрузка GraphQL схемы не только из файла, но и по ссылке; более расширенная настройка выходного файла включая хуки (дополнительный вызов isort, black и т.п.): многое другое, что будет необходимо или желаемо :) Если вы используете GraphQL на python и хотите внести вклад в развитие  сообщества  graphql-python, то можете предлагать свои улучшения в проекты https://github.com/denisart/graphql-query, https://github.com/denisart/graphql2python и, конечно, основные проекты python GraphQL сообщества https://github.com/graphql-python.