La biblioteca boto3 proporciona varios métodos de fábrica que devuelven recursos. Por ejemplo:
dynamo = ( boto3 .resource('dynamodb') .Table(os.environ['DYNAMODB_TABLE']) ) Quiero anotar esos recursos para poder verificar y completar mejor el tipo, pero el único tipo similar que pude encontrar fue from boto3.dynamodb.table import TableResource .
Cuando agrego esa anotación:
dynamo: TableResource = ( boto3 .resource('dynamodb') .Table(os.environ['DYNAMODB_TABLE']) ) El único método que ofrece la finalización automática es batch_writer(self, overwrite_by_pkeys) , aunque los documentos enumeran varios otros .
¿Es esta la clase incorrecta para usar como anotación? Al inspeccionar ese tipo de variable en la terminal, pude ver que era <class 'boto3.resources.factory.dynamodb.Table'> , pero no parece posible obtener ese tipo de forma estática.
Los tipos y métodos de la API no existen de forma estática. boto3 usa una arquitectura basada en datos, un diseño extremadamente dinámico que usa datos en formato JSON ( aquí hay un ejemplo) para determinar qué llamadas API son posibles. Hacen esto para facilitar la actualización de la biblioteca para incluir nuevos cambios de API. No estoy seguro, pero creo que podrían usar la misma estrategia para los SDK en otros idiomas, por lo que se pueden realizar cambios en varios SDK con poco trabajo duplicado.
Las bibliotecas deben adaptarse a los cambios en las necesidades de los usuarios y también a los cambios en las plataformas en las que se ejecutan. A medida que el crecimiento de AWS se aceleró a lo largo de los años, la velocidad a la que se actualizan nuestras API también se ha acelerado. Esto requirió que ideáramos un método escalable para brindar rápidamente soporte para múltiples actualizaciones de API cada semana, y es por eso que el soporte de API de AWS en Boto3 está casi completamente basado en datos. Boto3 tiene clases de 'cliente' que están impulsadas por modelos de API con formato JSON que describen las API de AWS, por lo que la mayoría de las funciones de servicio nuevas solo requieren una actualización de modelo simple. Esto nos permite brindar soporte para cambios de API muy rápidamente, de manera consistente y confiable.
También puede vislumbrar que esto suceda ingresando a una llamada de método como resource.Table en un depurador.
Además de la respuesta de Alex Hall. Las referencias directas se pueden utilizar para resolver este problema.
dynamo: 'boto3.resources.factory.dynamodb.Table' = ( boto3 .resource('dynamodb') .Table(os.environ['DYNAMODB_TABLE']))Es posible escribir código de anotación que usa DynamoDB con la ayuda de esta biblioteca: https://github.com/vemel/mypy_boto3 .
Instalación:
pip install boto3-stubs[dynamodb]Uso:
from mypy_boto3_dynamodb import ServiceResource dynamodb: ServiceResource = boto3.resource( "dynamodb", region_name=region ) # now type checker or IDE can infer type of `table` # and find its methods table = dynamodb.Table("example")También es posible anotar muchos otros servicios de boto3, consulte la página de GitHub de la biblioteca.