প্রোটোবাফ বার্তা

পাইথন ক্লায়েন্ট লাইব্রেরির সংস্করণ 14.0.0 একটি নতুন প্রয়োজনীয় কনফিগারেশন প্যারামিটার প্রবর্তন করে যার নাম use_proto_plus যা আপনি লাইব্রেরিটি প্রোটো-প্লাস বার্তা বা প্রোটোবাফ বার্তাগুলি ফিরিয়ে দিতে চান কিনা তা নির্দিষ্ট করে। কিভাবে এই প্যারামিটার সেট করতে হয় তার বিস্তারিত জানার জন্য, কনফিগারেশন ডক্স দেখুন।

এই বিভাগে কোন ধরণের বার্তা ব্যবহার করতে হবে তা বেছে নেওয়ার কার্যকারিতার প্রভাব বর্ণনা করে, তাই, আমরা সুপারিশ করি যে আপনি একটি জ্ঞাত সিদ্ধান্ত নেওয়ার জন্য বিকল্পগুলি পড়ুন এবং বুঝুন। যাইহোক, যদি আপনি কোড পরিবর্তন না করেই 14.0.0 সংস্করণে আপগ্রেড করতে চান, তাহলে ইন্টারফেসের পরিবর্তনগুলি ভাঙা এড়াতে use_proto_plus True সেট করতে পারেন।

প্রোটো-প্লাস বনাম প্রোটোবাফ বার্তা

সংস্করণ 10.0.0 -এ পাইথন ক্লায়েন্ট লাইব্রেরি একটি নতুন কোড জেনারেটর পাইপলাইনে স্থানান্তরিত হয়েছে যা প্রোটোবফ মেসেজ ইন্টারফেসের এর্গোনমিক্স উন্নত করার উপায় হিসাবে প্রোটো-প্লাসকে একীভূত করেছে যাতে তারা স্থানীয় পাইথন বস্তুর মতো আচরণ করে। এই উন্নতির ট্রেডঅফ হল যে প্রোটো-প্লাস কর্মক্ষমতা ওভারহেড প্রবর্তন করে।

প্রোটো প্লাস কর্মক্ষমতা

প্রোটো-প্লাসের একটি মূল সুবিধা হল যে এটি টাইপ মার্শালিং নামক একটি প্রক্রিয়ার মাধ্যমে প্রোটোবাফ বার্তা এবং সুপরিচিত প্রকারগুলিকে নেটিভ পাইথন প্রকারে রূপান্তর করে।

মার্শালিং ঘটে যখন একটি ক্ষেত্র একটি প্রোটো-প্লাস বার্তা দৃষ্টান্তে অ্যাক্সেস করা হয়, বিশেষত যখন একটি ক্ষেত্র হয় পড়া বা সেট করা হয়, উদাহরণস্বরূপ, একটি প্রোটোবাফ সংজ্ঞায়:

syntax = "proto3";

message Dog {
  string name = 1;
}

যখন এই সংজ্ঞাটি একটি প্রোটো-প্লাস ক্লাসে রূপান্তরিত হয়, তখন এটি দেখতে এরকম কিছু দেখাবে:

import proto

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

তারপরে আপনি Dog ক্লাস শুরু করতে পারেন এবং এর name ক্ষেত্রটি অ্যাক্সেস করতে পারেন যেমন আপনি অন্য কোনও পাইথন অবজেক্ট করবেন:

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

name ক্ষেত্র পড়ার এবং সেট করার সময়, মানটিকে একটি নেটিভ পাইথন str টাইপ থেকে একটি string টাইপে রূপান্তরিত করা হয় যাতে মানটি প্রোটোবাফ রানটাইমের সাথে সামঞ্জস্যপূর্ণ হয়।

সংস্করণ 10.0.0 প্রকাশের পর থেকে আমরা যে বিশ্লেষণ করেছি তাতে আমরা নির্ধারণ করেছি যে এই ধরনের রূপান্তরগুলি করার সময় ব্যয় করা সময় যথেষ্ট পরিমাণে কার্যক্ষমতার প্রভাব ফেলে যা ব্যবহারকারীদের প্রোটোবাফ বার্তাগুলি ব্যবহার করার বিকল্প দেওয়া গুরুত্বপূর্ণ৷

প্রোটো-প্লাস এবং প্রোটোবাফ বার্তাগুলির জন্য কেস ব্যবহার করুন

প্রোটো-প্লাস বার্তা ব্যবহারের ক্ষেত্রে
প্রোটো-প্লাস প্রোটোবাফ বার্তাগুলির তুলনায় অনেকগুলি ergonomic উন্নতি অফার করে, তাই তারা রক্ষণাবেক্ষণযোগ্য, পাঠযোগ্য কোড লেখার জন্য আদর্শ। যেহেতু তারা নেটিভ পাইথন অবজেক্টগুলিকে প্রকাশ করে, সেগুলি ব্যবহার করা এবং বোঝা সহজ।
Protobuf বার্তা ব্যবহার ক্ষেত্রে
কর্মক্ষমতা-সংবেদনশীল ব্যবহারের ক্ষেত্রে প্রোটোবাফগুলি ব্যবহার করুন, বিশেষত এমন অ্যাপগুলিতে যেগুলিকে দ্রুত বড় রিপোর্টগুলি প্রক্রিয়া করতে হবে, বা যেগুলি প্রচুর সংখ্যক ক্রিয়াকলাপের সাথে মিউটেট অনুরোধ তৈরি করে, উদাহরণস্বরূপ 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)

Protobuf বার্তা ইন্টারফেস পার্থক্য

প্রোটো-প্লাস ইন্টারফেসটি বিস্তারিতভাবে নথিভুক্ত করা হয়েছে, কিন্তু এখানে আমরা কিছু মূল পার্থক্য তুলে ধরব যা 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 টাইপের উদাহরণ এবং তাই বেশ কয়েকটি সুবিধার পদ্ধতির উত্তরাধিকারী।

Enum টাইপ পুনরুদ্ধার

enums পুনরুদ্ধার করার জন্য GoogleAdsClient.get_type পদ্ধতি ব্যবহার করার সময়, আপনি প্রোটো-প্লাস বা প্রোটোবাফ বার্তাগুলি ব্যবহার করছেন কিনা তার উপর নির্ভর করে যে বার্তাগুলি ফেরত দেওয়া হয় তা কিছুটা আলাদা। যেমন:

প্রোটো-প্লাস বার্তা
val = client.get_type("CampaignStatusEnum").CampaignStatus.PAUSED
প্রোটোবাফ বার্তা
val = client.get_type("CampaignStatusEnum").PAUSED

এনামগুলি পুনরুদ্ধার করা সহজতর করার জন্য, GoogleAdsClient দৃষ্টান্তগুলিতে একটি সুবিধার বৈশিষ্ট্য রয়েছে যার একটি সামঞ্জস্যপূর্ণ ইন্টারফেস রয়েছে আপনি যে বার্তার ধরণটি ব্যবহার করছেন তা নির্বিশেষে:

val = client.enums.CampaignStatusEnum.PAUSED

Enum মান পুনরুদ্ধার

কখনও কখনও একটি প্রদত্ত এনামের মান বা ফিল্ড আইডি জানার জন্য এটি দরকারী, উদাহরণস্বরূপ, CampaignStatusEnumPAUSED 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 নাম পুনরুদ্ধার

কখনও কখনও এটি একটি 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 সাথে প্রায় অভিন্ন আচরণ করে।

বারবার স্কেলার ক্ষেত্রে সংযুক্ত করা হচ্ছে

বারবার স্কেলার টাইপ ফিল্ডে মান যোগ করার সময়, যেমন 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

বার্তা কপি

প্রোটো-প্লাস এবং প্রোটোবাফ উভয় বার্তার জন্য, আমরা GoogleAdsClientcopy_from সহায়ক পদ্ধতি ব্যবহার করার পরামর্শ দিই:

client.copy_from(campaign, other_campaign)

খালি বার্তা ক্ষেত্র

আপনি যে ধরনের বার্তা ব্যবহার করছেন তা নির্বিশেষে খালি বার্তা ক্ষেত্র সেট করার প্রক্রিয়া একই। আপনাকে শুধু প্রশ্নযুক্ত ক্ষেত্রে একটি খালি বার্তা কপি করতে হবে। বার্তা অনুলিপি বিভাগের পাশাপাশি খালি বার্তা ক্ষেত্র নির্দেশিকা দেখুন। কিভাবে একটি খালি বার্তা ক্ষেত্র সেট করতে হয় তার একটি উদাহরণ এখানে দেওয়া হল:

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

ক্ষেত্রের নাম যা সংরক্ষিত শব্দ

প্রোটো-প্লাস বার্তাগুলি ব্যবহার করার সময়, যদি নামটি পাইথনে একটি সংরক্ষিত শব্দও হয় তবে ফিল্ডের নামগুলি স্বয়ংক্রিয়ভাবে একটি ট্রেলিং আন্ডারস্কোর সহ প্রদর্শিত হয়৷ এখানে একটি Asset উদাহরণের সাথে কাজ করার একটি উদাহরণ:

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

সংরক্ষিত নামের সম্পূর্ণ তালিকা গ্যাপিক জেনারেটর মডিউলে তৈরি করা হয়েছে। এটি প্রোগ্রামগতভাবেও অ্যাক্সেস করা যেতে পারে।

প্রথমে, মডিউলটি ইনস্টল করুন:

python -m pip install gapic-generator

তারপর, একটি পাইথন 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 সংস্করণে স্থানান্তরিত কোনো সমস্যা থাকে, আমাদের ট্র্যাকারে একটি সমস্যা ফাইল করুন