Uzupełnianie kodu w IDE

Środowiska IDE, takie jak VS Code i PyCharm, oferują wbudowane uzupełnianie kodu w języku Python.

Biblioteka google-ads-python generuje klasy komunikatów protobuf dynamicznie w czasie działania programu za pomocą metod pobierających w klasie GoogleAdsClient, co może utrudniać działanie funkcji uzupełniania kodu w środowisku IDE, które opierają się na statycznej analizie kodu źródłowego.

Aby zwiększyć zgodność z narzędziami do uzupełniania kodu, które opierają się na analizie statycznej, możesz:

  1. używać adnotacji typu z dynamicznymi metodami pobierającymi (zalecane);
  2. importować klasy komunikatów protobuf i klientów usług bezpośrednio.

Importy dynamiczne ze wskazówkami dotyczącymi typów

Używanie importów dynamicznych zapewnia, że kod pozostanie odporny na aktualizacje biblioteki. Dodanie adnotacji typu umożliwia uzupełnianie kodu w środowisku IDE bez utraty korzyści wynikających z inicjowania dynamicznego:

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")

Importy bezpośrednie

Możesz też bezpośrednio importować klasy komunikatów protobuf. To podejście umożliwia uzupełnianie kodu w środowisku IDE bez używania metod pobierających:

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()

Wady importów bezpośrednich

Bezpośrednie importowanie wygenerowanych klas ułatwia uzupełnianie kodu, ale wiąże się też z pewnymi kompromisami:

  1. Trudniejsze do zlokalizowania: nie zawsze jest oczywiste, w którym module znajduje się dana klasa, dlatego znalezienie prawidłowej ścieżki importu może być trudne.
  2. Niestabilne w przypadku aktualizacji: struktura katalogów wygenerowanych klas może się zmieniać w nowych wersjach biblioteki klienta. Jeśli importujesz klasy bezpośrednio, kod może przestać działać po aktualizacji, natomiast kod, który używa metod pobierających, nie jest narażony na tego typu zmiany.
  3. Wymagane ręczne inicjowanie: metoda get_service inicjuje usługi z uwierzytelnianiem, ustawieniami transportu i interceptorami gRPC (które dołączają nagłówki takie jak login-customer-id i linked-customer-id, obsługują logowanie i opakowują błędy w GoogleAdsException) przed ich zwróceniem. Jeśli importujesz i tworzysz instancje usług bezpośrednio, te interceptory są pomijane i musisz ręcznie skonfigurować dane logowania i kanały transportu:

    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,
    )