IDE のコード補完

VS Code や PyCharm などの IDE には、Python 言語のコード補完機能が組み込まれています。

google-ads-python ライブラリは、GoogleAdsClient クラスの getter メソッドを使用して、実行時に protobuf メッセージ クラスを動的に生成します。これにより、ソースコードの静的分析に依存する IDE コード補完機能が阻害される可能性があります。

静的解析に依存するコード補完ツールとの互換性を高めるには、次のいずれかを行います。

  1. 動的ゲッター メソッドで型アノテーションを使用する(推奨)。
  2. protobuf メッセージ クラスとサービス クライアントを直接インポートします。

型ヒント付きの動的インポート

動的インポートを使用すると、ライブラリの更新全体でコードの復元力が維持されます。型アノテーションを追加すると、動的初期化のメリットを損なうことなく、IDE コード補完を有効にできます。

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

直接インポート

protobuf メッセージ クラスを直接インポートすることもできます。この方法では、ゲッター メソッドを使用せずに、IDE コード補完をすぐに有効にできます。

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

直接インポートのデメリット

生成されたクラスを直接インポートすると、コード補完には役立ちますが、いくつかのトレードオフも発生します。

  1. 見つけにくい: 特定のクラスがどのモジュールにあるかが明確でない場合があるため、正しいインポートパスを見つけるのが難しいことがあります。
  2. アップグレードで脆弱になる: 生成されたクラスのディレクトリ構造は、クライアント ライブラリの新しいバージョンで変更される可能性があります。クラスを直接インポートすると、アップグレード時にコードが破損する可能性がありますが、ゲッター メソッドを使用するコードは、このような変更の影響を受けません。
  3. 手動初期化が必要: get_service メソッドは、認証、トランスポート設定、gRPC インターセプター(login-customer-id や linked-customer-id などのヘッダーをアタッチし、ロギングを処理し、エラーを GoogleAdsException でラップする)を使用してサービスを初期化してから、サービスを返します。サービスを直接インポートしてインスタンス化すると、インターセプタはバイパスされるため、認証情報とトランスポート チャネルを手動で構成する必要があります。

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