バージョン
14.0.0
Python クライアント ライブラリに、新しい必須構成パラメータが導入されました。
呼び出すかどうかを指定する use_proto_plus
という関数です。
proto-plus messages、または
protobuf メッセージ。詳細については、
このパラメータの設定方法については、構成ドキュメントをご覧ください。
このセクションでは、パフォーマンスへの影響について、
記載されています。詳しくは、このモジュールのコースで
十分な情報を得たうえで判断できます必要に応じて
コードを変更せずにバージョン 14.0.0
にアップグレードする場合は、
インターフェースの変更の互換性を損なわないように、use_proto_plus
を True
に変更。
proto-plus メッセージと protobuf メッセージ
バージョン 10.0.0
では、Python クライアント ライブラリが新しいコード生成ツールに移行されました。
統合されたパイプラインを
proto-plus を使用して、
人間工学的に改善された protobuf メッセージ インターフェースが、
オブジェクトに似ていますこの改善によるトレードオフは
パフォーマンスのオーバーヘッドが生じます
プロトコル + パフォーマンス
proto-plus の主な利点の一つは、protobuf を変換し、 メッセージ 既知の型を使用して ネイティブな Python 型を type というプロセスで マーシャリング。
マーシャリングは、proto-plus メッセージ インスタンスでフィールドがアクセスされたときに発生します。 具体的には、protobuf などで、フィールドが読み取られたり設定されたりした場合です。 定義:
syntax = "proto3";
message Dog {
string name = 1;
}
この定義を proto-plus クラスに変換すると、次のようになります。 例:
import proto
class Dog(proto.Message):
name = proto.Field(proto.STRING, number=1)
次に、Dog
クラスを初期化して、その name
フィールドにアクセスする場合と同様です。
次のように指定します。
dog = Dog()
dog.name = "Scruffy"
print(dog.name)
name
フィールドを読み取って設定すると、値がネイティブ
Python の str
型を string
型に変換するため、
その値が protobuf ランタイムと互換性があることを確認します。
バージョン 10.0.0
のリリース以降に実施された分析では、以下の点が改善されています。
これらのタイプのコンバージョンに費やす時間で、十分な余裕があると判断した
ユーザーが protobuf を使用できるようにすることが、パフォーマンスへの影響です。
ブロックすることもできます。
proto-plus メッセージと protobuf メッセージのユースケース
- Proto-plus メッセージのユースケース
- Proto-plus には、protobuf メッセージに比べ、人間工学的に多くの改善が加えられています。 保守可能で読みやすいコードを記述するのに最適ですこれらのツールは Python ネイティブ オブジェクトなので、使いやすく理解しやすいです。
- Protobuf メッセージのユースケース
- パフォーマンス重視のユースケース(特にアプリで)にプロトコル バッファを使用する
大量のレポートを迅速に処理する必要がある場合や、
多数のオペレーション(たとえば、
BatchJobService
またはOfflineUserDataJobService
。
動的に変化するメッセージ タイプ
アプリに適したメッセージ タイプを選択すると、
特定のワークフローで他のタイプを使用する
必要がありますこの例では、
用意されているユーティリティを使用して簡単に 2 つのタイプを動的に切り替えられます。
クライアント ライブラリを使用します。上記と同じ Dog
メッセージ クラスを使用します。
from google.ads.googleads import util
# Proto-plus message type
dog = Dog()
# Protobuf message type
dog = util.convert_proto_plus_to_protobuf(dog)
# Back to proto-plus message type
dog = util.convert_protobuf_to_proto_plus(dog)
Protobuf メッセージ インターフェースの違い
proto-plus インターフェースは ですが、ここでは Google 広告クライアントの一般的なユースケースに影響する主な相違点 ライブラリです。
バイトのシリアル化
- プロトコルとメッセージ
serialized = type(campaign).serialize(campaign) deserialized = type(campaign).deserialize(serialized)
- Protobuf メッセージ
serialized = campaign.SerializeToString() deserialized = campaign.FromString(serialized)
JSON シリアル化
- プロトコルとメッセージ
serialized = type(campaign).to_json(campaign) deserialized = type(campaign).from_json(serialized)
- Protobuf メッセージ
from google.protobuf.json_format import MessageToJson, Parse serialized = MessageToJson(campaign) deserialized = Parse(serialized, campaign)
フィールド マスク
フィールド マスク ヘルパー メソッドを api-core は protobuf を使用するように設計されている 作成します。そのため、proto-plus メッセージを使用する場合は、それらを protobuf に変換し、 ヘルパーを利用するためのメッセージを指定します。
- プロトコルとメッセージ
from google.api_core.protobuf_helpers import field_mask campaign = client.get_type("Campaign") protobuf_campaign = util.convert_proto_plus_to_protobuf(campaign) mask = field_mask(None, protobuf_campaign)
- Protobuf メッセージ
from google.api_core.protobuf_helpers import field_mask campaign = client.get_type("Campaign") mask = field_mask(None, campaign)
列挙型
proto-plus メッセージによって公開される列挙型は、Python のネイティブ
enum
タイプであるため、
多くの便利なメソッドを継承しています。
列挙型の取得
GoogleAdsClient.get_type
メソッドを使用して列挙型を取得すると、メッセージ
返されるメッセージの種類は、
protobuf メッセージです。例:
- プロトコルとメッセージ
val = client.get_type("CampaignStatusEnum").CampaignStatus.PAUSED
- Protobuf メッセージ
val = client.get_type("CampaignStatusEnum").PAUSED
列挙型の取得を簡単にするために、
どのインスタンスであるかに関係なく一貫したインターフェースを持つ GoogleAdsClient
インスタンス
使用しているメッセージ タイプ:
val = client.enums.CampaignStatusEnum.PAUSED
列挙値の取得
特定の列挙型の値(フィールド ID)を知っていると、
たとえば、CampaignStatusEnum
の PAUSED
は 3
に対応します。
- プロトコルとメッセージ
campaign = client.get_type("Campaign") campaign.status = client.enums.CampaignStatusEnum.PAUSED # To read the value of campaign status print(campaign.status.value)
- Protobuf メッセージ
campaign = client.get_type("Campaign") status_enum = client.enums.CampaignStatusEnum campaign.status = status_enum.PAUSED # To read the value of campaign status print(status_enum.CampaignStatus.Value(campaign.status))
列挙型名の取得
列挙型フィールドの名前を知っておくと便利な場合があります。たとえば
API からオブジェクトを読み取る場合、キャンペーンのステータスを知りたい場合は、
int 3
は以下に対応します。
- プロトコルとメッセージ
campaign = client.get_type("Campaign") campaign.status = client.enums.CampaignStatusEnum.PAUSED # To read the name of campaign status print(campaign.status.name)
- Protobuf メッセージ
campaign = client.get_type("Campaign") status_enum = client.enums.CampaignStatusEnum # Sets the campaign status to the int value for PAUSED campaign.status = status_enum.PAUSED # To read the name of campaign status status_enum.CampaignStatus.Name(campaign.status)
繰り返しフィールド
proto-plus
ドキュメント、
通常、繰り返しフィールドは型付きリストと同等です。
list
とほぼ同じように動作します。
繰り返しスカラー フィールドへの追加
繰り返しスカラーに値を追加する場合
type フィールド。例:
string
または int64
フィールドの場合、メッセージに関係なくインターフェースは同じ
type:
- プロトコルとメッセージ
ad.final_urls.append("https://www.example.com")
- Protobuf メッセージ
ad.final_urls.append("https://www.example.com")
これには、extend
など、他のすべての一般的な list
メソッドも含まれます。
- プロトコルとメッセージ
ad.final_urls.extend(["https://www.example.com", "https://www.example.com/2"])
- Protobuf メッセージ
ad.final_urls.extend(["https://www.example.com", "https://www.example.com/2"])
繰り返しフィールドにメッセージ型を追加する
繰り返しフィールドがスカラーでない場合 、 少し異なります。
- プロトコルとメッセージ
frequency_cap = client.get_type("FrequencyCapEntry") frequency_cap.cap = 100 campaign.frequency_caps.append(frequency_cap)
- Protobuf メッセージ
# The add method initializes a message and adds it to the repeated field frequency_cap = campaign.frequency_caps.add() frequency_cap.cap = 100
繰り返しフィールドの割り当て
スカラー繰り返しフィールドと非スカラー繰り返しフィールドのどちらについても、リストを 使用できます。
- プロトコルとメッセージ
# In proto-plus it's possible to use assignment. urls = ["https://www.example.com"] ad.final_urls = urls
- Protobuf メッセージ
# Protobuf messages do not allow assignment, but you can replace the # existing list using slice syntax. urls = ["https://www.example.com"] ad.final_urls[:] = urls
空のメッセージ
メッセージ インスタンスにメッセージが含まれているかどうかを そのフィールドのいずれかが設定済みであることを 確認できます
- プロトコルとメッセージ
# When using proto-plus messages you can simply check the message for # truthiness. is_empty = bool(campaign) is_empty = not campaign
- Protobuf メッセージ
is_empty = campaign.ByteSize() == 0
メッセージのコピー
proto-plus メッセージと protobuf メッセージの両方には、copy_from
を使用することをおすすめします。
GoogleAdsClient
のヘルパー メソッド:
client.copy_from(campaign, other_campaign)
空のメッセージ フィールド
空のメッセージ フィールドを設定する手順は、 メッセージタイプを選択できます空のメッセージをフィールドにコピーするだけで済みます。 確認できます。[メッセージのコピー] セクションと「空のメッセージ」セクションを参照 フィールド ガイドをご覧ください。これは 空のメッセージ フィールドを設定するには:
client.copy_from(campaign.manual_cpm, client.get_type("ManualCpm"))
予約済みの単語であるフィールド名
proto-plus メッセージを使用すると、フィールド名が自動的に
名前が Python の予約語でもある場合、末尾にアンダースコアを付けます。こちらが
Asset
インスタンスの操作例:
asset = client.get_type("Asset")
asset.type_ = client.enums.AssetTypeEnum.IMAGE
予約されている電話番号の一覧は、 名前 構築されます。 Generator モジュールを使用します。かもしれない アクセスすることもできます。
まず、モジュールをインストールします。
python -m pip install gapic-generator
次に、Python の REPL またはスクリプトで次の操作を行います。
import gapic.utils
print(gapic.utils.reserved_names.RESERVED_NAMES)
フィールドの有無
protobuf メッセージ インスタンスのフィールドにはデフォルト値があるため、 フィールドが設定されているかどうかは、常に直感的にわかります。
- プロトコルとメッセージ
# Use the "in" operator. has_field = "name" in campaign
- Protobuf メッセージ
campaign = client.get_type("Campaign") # Determines whether "name" is set and not just an empty string. campaign.HasField("name")
protobuf
Message
クラス インターフェースには HasField
メソッドがあり、このメソッドでは、
値が設定されています。
Protobuf メッセージ メソッド
protobuf メッセージ インターフェースには、いくつかの便利なメソッドが含まれていますが、 proto-plus インターフェースの一部簡単にアクセスできます。 次のようにして、proto-plus メッセージを対応する protobuf に変換します。
# Accessing the ListFields method
protobuf_campaign = util.convert_protobuf_to_proto_plus(campaign)
print(campaign.ListFields())
# Accessing the Clear method
protobuf_campaign = util.convert_protobuf_to_proto_plus(campaign)
print(campaign.Clear())
公開バグトラッカー
これらの変更についてご不明な点がある場合や、
バージョン 14.0.0
のライブラリについては、
の
。