प्रोटोबफ़ मैसेज

वर्शन 14.0.0 के Python क्लाइंट लाइब्रेरी एक नया ज़रूरी कॉन्फ़िगरेशन पैरामीटर पेश करती है use_proto_plus जिसे कॉल किया जाता है, जो बताता है कि आपको लाइब्रेरी वापस करनी है या नहीं प्रोटो-प्लस मैसेज या प्रोटोबफ़ मैसेज. जानकारी के लिए इस पैरामीटर को कैसे सेट करें, कॉन्फ़िगरेशन दस्तावेज़ देखें.

इस सेक्शन में, यह बताया गया है कि अलग-अलग तरह के इसलिए, हमारा सुझाव है कि आप अपने विज्ञापनों को ताकि आप सोच-समझकर फ़ैसला ले सकें. हालांकि, अगर आपको कोड में बदलाव किए बिना वर्शन 14.0.0 में अपग्रेड करें, तो आप इंटरफ़ेस में किए गए बदलावों को खारिज होने से बचाने के लिए, use_proto_plus से True तक.

प्रोटो-प्लस मैसेज बनाम प्रोटोबफ़ मैसेज

वर्शन 10.0.0 में Python क्लाइंट लाइब्रेरी को नए कोड जनरेटर में माइग्रेट किया गया पाइपलाइन जो इंटिग्रेट हो चुकी है बेहतर बनाने के तरीके के रूप में प्रोटो-प्लस यह प्रोटोबफ़ मैसेज इंटरफ़ेस पर आधारित एर्गोनॉमिक्स का इस्तेमाल करता है, जिसकी वजह से वे बेहतर तरीके से काम करते हैं जैसे कि नेटिव Python ऑब्जेक्ट. इस सुधार का फ़ायदा यह है कि प्रोटो-प्लस परफ़ॉर्मेंस ओवरहेड की जानकारी देता है.

प्रोटो-प्लस परफ़ॉर्मेंस

प्रोटो-प्लस का एक मुख्य फ़ायदा यह है कि यह प्रोटोबफ़ को बदलता है मैसेज और जाने-पहचाने टाइप होते हैं, नेटिव Python, type नाम की प्रोसेस के ज़रिए टाइप करता है मार्शलिंग.

मार्शलिंग तब होता है, जब किसी फ़ील्ड को प्रोटोकॉल-प्लस मैसेज इंस्टेंस पर ऐक्सेस किया जाता है, खास तौर पर, जब किसी फ़ील्ड को पढ़ा या सेट किया गया हो. उदाहरण के लिए, किसी प्रोटोबफ़ में परिभाषा:

syntax = "proto3";

message Dog {
  string name = 1;
}

जब इस परिभाषा को प्रोटो-प्लस क्लास में बदला जाता है, तो यह कुछ ऐसा दिखेगा इस तरह:

import proto

class Dog(proto.Message):
    name = proto.Field(proto.STRING, number=1)

इसके बाद, Dog क्लास शुरू करें और उसके name फ़ील्ड को उसी तरह ऐक्सेस करें जैसे आप करते हैं कोई अन्य Python ऑब्जेक्ट:

dog = Dog()
dog.name = "Scruffy"
print(dog.name)

name फ़ील्ड को पढ़ने और सेट करने पर, वैल्यू को नेटिव से बदला जाता है Python str को string टाइप में बदलना यह तय करता है कि वैल्यू, प्रोटोबफ़ रनटाइम के साथ काम करती है या नहीं.

वर्शन 10.0.0 के रिलीज़ होने के बाद से, हमने जो विश्लेषण किया है उसमें यह पता चला है कि इस प्रकार के रूपांतरणों में लगने वाले समय से इसलिए, उपयोगकर्ताओं को प्रोटोबफ़ का इस्तेमाल करने का विकल्प देना ज़रूरी है मैसेज.

प्रोटो-प्लस और प्रोटोबफ़ मैसेज के लिए केस इस्तेमाल करें

प्रोटो-प्लस मैसेज के इस्तेमाल के उदाहरण
प्रोटो-प्लस, प्रोटोबफ़ मैसेज की तुलना में कई आसान सुधार करता है, इसलिए, वे मैनेज किए जा सकने वाले और पढ़ने लायक कोड को लिखने के लिए बिलकुल सही होते हैं. क्योंकि इनसे, हो सकता है कि नेटिव Python ऑब्जेक्ट के लिए दिया जाता है. इन्हें इस्तेमाल करना और समझना आसान होता है.
प्रोटोबफ़ मैसेज के इस्तेमाल के उदाहरण
खास तौर पर ऐप्लिकेशन में, परफ़ॉर्मेंस के लिए संवेदनशील मामलों के लिए प्रोटोबफ़ का इस्तेमाल करें जिन्हें बड़ी रिपोर्ट को तेज़ी से प्रोसेस करना पड़ता हो या ऐसे अनुरोध जिनके ज़रिए करने की एक बड़ी संख्या है. उदाहरण के लिए, BatchJobService या OfflineUserDataJobService.

मैसेज के टाइप में डाइनैमिक तरीके से बदलाव करना

अपने ऐप्लिकेशन के लिए सही मैसेज टाइप चुनने के बाद, आपको किसी खास वर्कफ़्लो के लिए, आपको किसी अन्य टाइप का इस्तेमाल करना होगा. इस मामले में, दो तरह की सेवाओं के बीच आसानी से स्विच करने के लिए, क्लाइंट लाइब्रेरी पर जाएं. ऊपर दिए गए उसी 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)

प्रोटोबफ़ मैसेज इंटरफ़ेस में अंतर

प्रोटो-प्लस इंटरफ़ेस को , लेकिन यहां हम हाइलाइट करेंगे कि कुछ ऐसे मुख्य अंतर जो Google Ads क्लाइंट के इस्तेमाल के सामान्य उदाहरणों पर असर डालते हैं लाइब्रेरी.

बाइट सीरियलाइज़ेशन

प्रोटो-प्लस मैसेज
serialized = type(campaign).serialize(campaign)
deserialized = type(campaign).deserialize(serialized)
प्रोटोबफ़ मैसेज
serialized = campaign.SerializeToString()
deserialized = campaign.FromString(serialized)

JSON को क्रम से लगाना

प्रोटो-प्लस मैसेज
serialized = type(campaign).to_json(campaign)
deserialized = type(campaign).from_json(serialized)
प्रोटोबफ़ मैसेज
from google.protobuf.json_format import MessageToJson, Parse

serialized = MessageToJson(campaign)
deserialized = Parse(serialized, campaign)

फ़ील्ड मास्क

फ़ील्ड मास्क हेल्पर तरीका api-core को प्रोटोबफ़ का इस्तेमाल करने के लिए बनाया गया है मैसेज इंस्टेंस. इसलिए प्रोटो-प्लस मैसेज का इस्तेमाल करते समय, उन्हें प्रोटोबफ़ में बदल दें हेल्पर का इस्तेमाल करने के लिए मैसेज:

प्रोटो-प्लस मैसेज
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)
प्रोटोबफ़ मैसेज
from google.api_core.protobuf_helpers import field_mask

campaign = client.get_type("Campaign")
mask = field_mask(None, campaign)

Enums

प्रोटो-प्लस मैसेज के ज़रिए दिखाए गए Enum, Python के मूल इंस्टेंस हैं enum टाइप और इसलिए इनहेरिट करने का काम पूरा हो जाता है.

Enum टाइप की रिकवरी

ईनम पाने के लिए GoogleAdsClient.get_type तरीके का इस्तेमाल करने पर, मैसेज जो दिखाई देते हैं, वे थोड़े अलग होते हैं. यह इस बात पर निर्भर करता है कि आप इस्तेमाल कर रहे हैं या नहीं प्रोटो-प्लस या प्रोटोबफ़ मैसेज. उदाहरण के लिए:

प्रोटो-प्लस मैसेज
val = client.get_type("CampaignStatusEnum").CampaignStatus.PAUSED
प्रोटोबफ़ मैसेज
val = client.get_type("CampaignStatusEnum").PAUSED

enum को वापस पाने की प्रक्रिया को आसान बनाने के लिए, इस पर एक सुविधा एट्रिब्यूट है ऐसे GoogleAdsClient इंस्टेंस जिनका इंटरफ़ेस एक जैसा है का उपयोग किया जा रहा है:

val = client.enums.CampaignStatusEnum.PAUSED

Enum वैल्यू वापस पाना

कभी-कभी किसी दिए गए ईनम के मान या फ़ील्ड आईडी को जानना उदाहरण के लिए, 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)
प्रोटोबफ़ मैसेज
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 नाम की रिकवरी

कभी-कभी ईनम फ़ील्ड का नाम जानना मददगार होता है. उदाहरण के लिए, जब 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)
प्रोटोबफ़ मैसेज
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)

दोहराए गए फ़ील्ड

जैसा कि प्रोटो-प्लस में बताया गया है दस्तावेज़, दोहराए गए फ़ील्ड आम तौर पर टाइप की गई सूचियों के बराबर होते हैं, जिसका मतलब है कि वे यह list की तरह काम करता है.

दोहराए गए अदिश फ़ील्ड में जोड़ना

दोहराए गए स्केलर में वैल्यू जोड़ते समय type फ़ील्ड, उदाहरण के लिए string या int64 फ़ील्ड, इंटरफ़ेस एक जैसा ही रहता है, भले ही उसमें कोई भी मैसेज हो टाइप:

प्रोटो-प्लस मैसेज
ad.final_urls.append("https://www.example.com")
प्रोटोबफ़ मैसेज
ad.final_urls.append("https://www.example.com")

इसमें, list के अन्य सभी सामान्य तरीके भी शामिल हैं, जैसे कि extend:

प्रोटो-प्लस मैसेज
ad.final_urls.extend(["https://www.example.com", "https://www.example.com/2"])
प्रोटोबफ़ मैसेज
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)
प्रोटोबफ़ मैसेज
# 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 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
प्रोटोबफ़ मैसेज
is_empty = campaign.ByteSize() == 0

मैसेज की कॉपी

प्रोटो-प्लस और प्रोटोबफ़ मैसेज, दोनों के लिए ही हमारा सुझाव है कि आप copy_from का इस्तेमाल करें GoogleAdsClient पर सहायक तरीका:

client.copy_from(campaign, other_campaign)

खाली मैसेज फ़ील्ड

खाली मैसेज फ़ील्ड को सेट करने की प्रोसेस वही है जो चाहे का उपयोग किया जा रहा है. आपको फ़ील्ड में बस एक खाली मैसेज कॉपी करना होगा सवाल है. मैसेज कॉपी सेक्शन और खाली मैसेज देखें फ़ील्ड से जुड़ी गाइड. यहां इसका उदाहरण दिया गया है कि खाली मैसेज फ़ील्ड सेट करने के लिए:

client.copy_from(campaign.manual_cpm, client.get_type("ManualCpm"))

फ़ील्ड के ऐसे नाम जो रिज़र्व किए गए हैं

प्रोटो-प्लस मैसेज का इस्तेमाल करते समय, फ़ील्ड के नाम अपने-आप अगर Python में यह नाम भी रिज़र्व किया गया शब्द है, तो आखिर में अंडरस्कोर डालें. यह रही Asset इंस्टेंस के साथ काम करने का उदाहरण:

asset = client.get_type("Asset")
asset.type_ = client.enums.AssetTypeEnum.IMAGE

रिज़र्व किए गए खातों की पूरी सूची नाम का निर्माण गैपिक में किया गया है जनरेटर मॉड्यूल का इस्तेमाल करें. यह काम किया जा सकता है प्रोग्राम के हिसाब से भी ऐक्सेस किया जा सकता है.

सबसे पहले, मॉड्यूल इंस्टॉल करें:

python -m pip install gapic-generator

फिर, Python REPL या स्क्रिप्ट में:

import gapic.utils
print(gapic.utils.reserved_names.RESERVED_NAMES)

फ़ील्ड में मौजूदगी

प्रोटोबफ़ मैसेज इंस्टेंस में मौजूद फ़ील्ड में डिफ़ॉल्ट वैल्यू होती हैं. इसलिए, यह यह जानने के लिए हमेशा सहज रहता है कि फ़ील्ड सेट है या नहीं.

प्रोटो-प्लस मैसेज
# Use the "in" operator.
has_field = "name" in campaign
प्रोटोबफ़ मैसेज
campaign = client.get_type("Campaign")
# Determines whether "name" is set and not just an empty string.
campaign.HasField("name")

प्रोटोबफ़ Message क्लास इंटरफ़ेस में एक HasField तरीका होता है, जिससे यह तय होता है कि मैसेज सेट कर दिया गया हो, भले ही उसे डिफ़ॉल्ट वैल्यू पर सेट किया गया हो.

प्रोटोबफ़ मैसेज के तरीके

प्रोटोबफ़ संदेश इंटरफ़ेस में कुछ सुविधा विधियां शामिल हैं, जो का हिस्सा है; हालांकि, विज्ञापन से उन्हें सुरक्षित रखने के लिए, एक प्रोटो-प्लस मैसेज को उसके प्रोटोबफ़ काउंटर में कन्वर्ट करना:

# 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 है, तो हमारी समस्या वाला है.