Los IDE, como VS Code y PyCharm, ofrecen autocompletado de código integrado para el lenguaje Python.
La biblioteca google-ads-python genera clases de mensajes de protobuf de forma dinámica
en el tiempo de ejecución con métodos getter en la clase GoogleAdsClient,
lo que puede inhibir las funciones de autocompletado de código del IDE que dependen del análisis estático del
código fuente.
Para mejorar la compatibilidad con las herramientas de autocompletado de código que dependen del análisis estático, puedes hacer lo siguiente:
- Usar anotaciones de tipo con métodos getter dinámicos (recomendado).
- Importar directamente las clases de mensajes de protobuf y los clientes de servicio
Importaciones dinámicas con sugerencias de tipo
El uso de importaciones dinámicas garantiza que tu código siga siendo resistente en las actualizaciones de la biblioteca. Agregar anotaciones de tipo permite el autocompletado de código del IDE sin perder los beneficios de la inicialización dinámica:
from google.ads.googleads.client import GoogleAdsClient
from google.ads.googleads.v26.resources.types.campaign import (
Campaign,
)
client = GoogleAdsClient.load_from_storage()
# Type hints allow the IDE to provide code completion suggestions while
# retaining dynamic class generation.
campaign: Campaign = client.get_type("Campaign")
Importaciones directas
También puedes importar clases de mensajes de protobuf directamente. Este enfoque permite el autocompletado de código del IDE de inmediato, sin usar métodos getter:
from google.ads.googleads.v26.resources import Campaign
# The Campaign class is imported directly, enabling the IDE to read the
# class definition and make code completion suggestions.
campaign = Campaign()
Desventajas de las importaciones directas
Si bien la importación directa de clases generadas ayuda con el autocompletado de código, también presenta algunas desventajas:
- Es más difícil de ubicar: No siempre es obvio en qué módulo se encuentra una clase determinada, por lo que encontrar la ruta de importación correcta puede ser difícil.
- Es frágil en las actualizaciones: La estructura de directorios de las clases generadas puede cambiar con las versiones nuevas de la biblioteca cliente. Si importas clases directamente, es posible que tu código se interrumpa cuando realices la actualización, mientras que el código que usa métodos getter no se ve afectado por este tipo de cambios.
Se requiere inicialización manual: El método
get_serviceinicializa los servicios con la autenticación, la configuración de transporte y los interceptores de gRPC (que adjuntan encabezados comologin-customer-idylinked-customer-id, controlan el registro y ajustan los errores enGoogleAdsException) antes de mostrarlos. Si importas y creas instancias de servicios directamente, se omiten esos interceptores y debes configurar las credenciales y los canales de transporte de forma manual:from google.ads.googleads.v26.services.services import ( campaign_service as campaign_service_module, ) # Dynamic service getter (initializes credentials, transport, and gRPC # interceptors automatically). campaign_service = client.get_service("CampaignService") # Direct service client import (requires manual credential and interceptor # configuration). campaign_service_client = campaign_service_module.CampaignServiceClient( credentials=client.credentials, )