use_proto_plus
yapılandırma parametresiyle, kitaplığın proto-plus iletileri mi yoksa protobuf iletileri mi döndürmesini istediğinizi belirtebilirsiniz. Bu parametrenin nasıl ayarlanacağı hakkında ayrıntılı bilgi için yapılandırma belgelerine bakın.
Bu bölümde, hangi ileti türlerinin kullanılacağının seçilmesinin performans üzerindeki etkileri açıklanmaktadır. Bu nedenle, bilinçli bir karar vermek için seçenekleri okumanızı ve anlamanızı öneririz.
Proto-plus ve protobuf mesajları
Kod oluşturucu işlem hattı, protobuf ileti arayüzünün ergonomisini iyileştirmek için proto-plus'ı entegre eder. Bu sayede, arayüzün yerel Python nesneleri gibi davranması sağlanır. Ancak bu, proto-plus kullanmanın performans ek yükü getirdiği anlamına gelir.
Proto-plus performansı
Proto-plus'ın temel avantajlarından biri, protobuf mesajlarını ve iyi bilinen türleri tür sıralama adı verilen bir işlemle yerel Python türlerine dönüştürmesidir.
Marshaling, bir alana proto-plus ileti örneğinde erişildiğinde, özellikle de bir alan okunduğunda veya ayarlandığında (ör. protobuf tanımında) gerçekleşir:
syntax = "proto3";
message Dog {
string name = 1;
}
Bu tanım proto-plus sınıfına dönüştürüldüğünde şöyle görünür:
import proto
class Dog(proto.Message):
name = proto.Field(proto.STRING, number=1)
Ardından Dog
sınıfını başlatabilir ve name
alanına diğer Python nesnelerinde olduğu gibi erişebilirsiniz:
dog = Dog()
dog.name = "Scruffy"
print(dog.name)
name
alanı okunup ayarlanırken değer, yerel bir Python str
türünden string
türüne dönüştürülür. Böylece değer, protobuf çalışma zamanıyla uyumlu olur.
Performans analizlerimize göre, bu tür dönüşümlerin yapılması için harcanan sürenin performansı yeterince etkilediğini ve kullanıcıların, ihtiyaçlarına göre protobuf mesajlarını kullanıp kullanmamaya karar vermesi gerektiğini belirledik.
Proto-plus ve protobuf mesajlarının kullanım alanları
- Proto-plus mesaj kullanım alanları
- Proto-plus, protobuf mesajlarına kıyasla bir dizi ergonomik iyileştirme sunar. Bu nedenle, bakımı kolay ve okunabilir kod yazmak için idealdir. Yerel Python nesnelerini ortaya çıkardıkları için daha kolay kullanılır ve anlaşılırlar.
- Protobuf mesajı kullanım alanları
- Performans açısından hassas kullanım alanlarında, özellikle büyük raporları hızlı bir şekilde işlemesi gereken veya çok sayıda işlem içeren mutasyon istekleri oluşturan uygulamalarda (ör.
BatchJobService
veyaOfflineUserDataJobService
ile) protobuf'ları kullanın.
Mesaj türlerini dinamik olarak değiştirme
Uygulamanız için uygun mesaj türünü seçtikten sonra belirli bir iş akışı için diğer türü kullanmanız gerektiğini fark edebilirsiniz. Bu durumda, istemci kitaplığının sunduğu yardımcı programları kullanarak iki tür arasında dinamik olarak geçiş yapmak kolaydır. Yukarıdaki Dog
mesaj sınıfını kullanarak:
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 mesaj arayüzü farklılıkları
Proto-plus arayüzü ayrıntılı olarak belgelenmiştir. Ancak burada, Google Ads istemci kitaplığının yaygın kullanım alanlarını etkileyen bazı temel farklılıkları vurgulayacağız.
Bayt serileştirme
- Proto-plus mesajları
serialized = type(campaign).serialize(campaign) deserialized = type(campaign).deserialize(serialized)
- Protobuf mesajları
serialized = campaign.SerializeToString() deserialized = campaign.FromString(serialized)
JSON serileştirme
- Proto-plus mesajları
serialized = type(campaign).to_json(campaign) deserialized = type(campaign).from_json(serialized)
- Protobuf mesajları
from google.protobuf.json_format import MessageToJson, Parse serialized = MessageToJson(campaign) deserialized = Parse(serialized, campaign)
Alan maskeleri
api-core tarafından sağlanan alan maskesi yardımcı yöntemi, protobuf mesaj örneklerini kullanmak üzere tasarlanmıştır. Bu nedenle, proto-plus mesajlarını kullanırken yardımcıyı kullanmak için bunları protobuf mesajlarına dönüştürün:
- Proto-plus mesajları
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 mesajları
from google.api_core.protobuf_helpers import field_mask campaign = client.get_type("Campaign") mask = field_mask(None, campaign)
Sıralamalar
Proto-plus mesajları tarafından kullanıma sunulan enumarasyonlar, Python'ın yerel enum
türünün örnekleridir ve bu nedenle bir dizi kolaylık yöntemini devralır.
Enum türü alma
Numaralandırılmış değerleri almak için GoogleAdsClient.get_type
yöntemi kullanılırken döndürülen mesajlar, proto-plus veya protobuf mesajlarını kullanmanıza bağlı olarak biraz farklılık gösterir. Örneğin:
- Proto-plus mesajları
val = client.get_type("CampaignStatusEnum").CampaignStatus.PAUSED
- Protobuf mesajları
val = client.get_type("CampaignStatusEnum").PAUSED
Numaralandırılmış değerleri almayı kolaylaştırmak için, kullandığınız mesaj türünden bağımsız olarak tutarlı bir arayüze sahip olan GoogleAdsClient
örneklerinde bir kolaylık özelliği bulunur:
val = client.enums.CampaignStatusEnum.PAUSED
Enum değeri alma
Bazen belirli bir enum'un değerini veya alan kimliğini bilmek yararlı olabilir. Örneğin, CampaignStatusEnum
üzerindeki PAUSED
, 3
ile eşleşir:
- Proto-plus mesajları
campaign = client.get_type("Campaign") campaign.status = client.enums.CampaignStatusEnum.PAUSED # To read the value of campaign status print(campaign.status.value)
- Protobuf mesajları
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))
Enum adı alma
Bazen bir enum alanının adını bilmek yararlı olabilir. Örneğin, API'den nesneleri okurken 3
int değerinin hangi kampanya durumuna karşılık geldiğini bilmek isteyebilirsiniz:
- Proto-plus mesajları
campaign = client.get_type("Campaign") campaign.status = client.enums.CampaignStatusEnum.PAUSED # To read the name of campaign status print(campaign.status.name)
- Protobuf mesajları
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)
Yinelenen alanlar
proto-plus dokümanlarında açıklandığı gibi, tekrarlanan alanlar genellikle türü belirlenmiş listelere eşdeğerdir. Bu nedenle, list
ile neredeyse aynı şekilde davranırlar.
Yinelenen skaler alanlara değer ekleme
Tekrarlanan scalar
type alanlarına (örneğin, string
veya int64
alanları) değer eklerken mesaj türünden bağımsız olarak aynı arayüz kullanılır:
- Proto-plus mesajları
ad.final_urls.append("https://www.example.com")
- Protobuf mesajları
ad.final_urls.append("https://www.example.com")
Bu, list
gibi diğer tüm yaygın yöntemleri de içerir. Örneğin extend
:
- Proto-plus mesajları
ad.final_urls.extend(["https://www.example.com", "https://www.example.com/2"])
- Protobuf mesajları
ad.final_urls.extend(["https://www.example.com", "https://www.example.com/2"])
Tekrarlanan alanlara mesaj türleri ekleme
Tekrarlanan alan skaler türde değilse tekrarlanan alanlara eklenirken davranış biraz farklıdır:
- Proto-plus mesajları
frequency_cap = client.get_type("FrequencyCapEntry") frequency_cap.cap = 100 campaign.frequency_caps.append(frequency_cap)
- Protobuf mesajları
# The add method initializes a message and adds it to the repeated field frequency_cap = campaign.frequency_caps.add() frequency_cap.cap = 100
Yinelenen alanları atama
Hem skaler hem de skaler olmayan tekrarlanan alanlar için listeleri alana farklı şekillerde atayabilirsiniz:
- Proto-plus mesajları
# In proto-plus it's possible to use assignment. urls = ["https://www.example.com"] ad.final_urls = urls
- Protobuf mesajları
# 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
Boş mesajlar
Bazen bir ileti örneğinin herhangi bir bilgi içerip içermediğini veya alanlarından herhangi birinin ayarlanıp ayarlanmadığını bilmek yararlı olabilir.
- Proto-plus mesajları
# When using proto-plus messages you can simply check the message for # truthiness. is_empty = bool(campaign) is_empty = not campaign
- Protobuf mesajları
is_empty = campaign.ByteSize() == 0
Mesaj kopyası
Hem proto-plus hem de protobuf mesajları için copy_from
yardımcı yöntemini GoogleAdsClient
üzerinde kullanmanızı öneririz:
client.copy_from(campaign, other_campaign)
Boş mesaj alanları
Boş mesaj alanları ayarlama süreci, kullandığınız mesaj türünden bağımsız olarak aynıdır. Söz konusu alana boş bir mesajı kopyalamanız yeterlidir. İleti kopyası bölümünün yanı sıra Boş İleti Alanları rehberine de göz atın. Boş bir mesaj alanının nasıl ayarlanacağına dair bir örneği aşağıda bulabilirsiniz:
client.copy_from(campaign.manual_cpm, client.get_type("ManualCpm"))
Ayrılmış kelimeler olan alan adları
Proto-plus mesajları kullanılırken, ad Python'da ayrılmış bir kelimeyse alan adları otomatik olarak sondaki alt çizgiyle birlikte görünür. Asset
örneğiyle çalışma örneğini aşağıda görebilirsiniz:
asset = client.get_type("Asset")
asset.type_ = client.enums.AssetTypeEnum.IMAGE
Ayrılmış adların tam listesi, gapic generator modülünde oluşturulur. Programatik olarak da erişilebilir.
Öncelikle modülü yükleyin:
python -m pip install gapic-generator
Ardından, Python REPL veya komut dosyasında:
import gapic.utils
print(gapic.utils.reserved_names.RESERVED_NAMES)
Alan varlığı
Protobuf mesaj örneklerindeki alanların varsayılan değerleri olduğundan, bir alanın ayarlanıp ayarlanmadığını anlamak her zaman kolay olmayabilir.
- Proto-plus mesajları
# Use the "in" operator. has_field = "name" in campaign
- Protobuf mesajları
campaign = client.get_type("Campaign") # Determines whether "name" is set and not just an empty string. campaign.HasField("name")
Protobuf
Message
sınıf arayüzünde, bir mesajdaki alanın varsayılan bir değere ayarlanmış olsa bile ayarlanıp ayarlanmadığını belirleyen bir HasField
yöntemi bulunur.
Protobuf mesaj yöntemleri
Protobuf ileti arayüzü, proto-plus arayüzünün parçası olmayan bazı kolaylık yöntemleri içerir. Ancak, proto-plus iletisini protobuf karşılığına dönüştürerek bu yöntemlere kolayca erişebilirsiniz:
# 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())
Sorun izleyici
Bu değişiklikler veya kitaplığın en yeni sürümüne geçişle ilgili herhangi bir sorunuz ya da sorununuz varsa izleyicimizde sorun kaydı oluşturun.