পুনরাবৃত্তি ক্ষেত্রে নিযুক্ত কিভাবে?


93

আমি পাইথনে প্রোটোকল বাফার ব্যবহার করছি এবং আমার একটি Personবার্তা রয়েছে

repeated uint64 id

তবে যখন আমি এর জন্য একটি মান নির্ধারণ করার চেষ্টা করি:

person.id = [1, 32, 43432]

আমি একটি ত্রুটি পেয়েছি: Assigment not allowed for repeated field "id" in protocol message object পুনরাবৃত্ত ক্ষেত্রের জন্য একটি মান নির্ধারণ কিভাবে?

উত্তর:


121

অনুযায়ী ডকুমেন্টেশন আপনি সরাসরি পুনরাবৃত্তি মাঠে দায়িত্ব অর্পণ করা সক্ষম হয় না। এই ক্ষেত্রে, আপনি extendতালিকার সমস্ত উপাদানগুলিকে ফিল্ডে যুক্ত করতে কল করতে পারেন।

person.id.extend([1, 32, 43432])

11
একইভাবে, একক মান যুক্ত করার জন্য append(), যেমন , ব্যবহার করুন person.id.append(1)। এটি কোনও প্রোটোবুফ repeated ক্ষেত্রের জন্য প্রযোজ্য ।
হিন্দোল

17
appendক্ষেত্রটি কোনও কাঁচা টাইপের পরিবর্তে (যেমন স্ট্রিং, ইন্ট 32) ইত্যাদি কোনও বার্তা প্রকারের কাজ করে না। extendবার্তার ধরণের জন্য কাজ করে।
abeboparebop

4
আপনি যদি বারবার বার্তার বার্তার ক্ষেত্রটি ওভাররাইট করতে চান তবে আপনাকে প্রথমে মুছতে হবে এবং তারপরে প্রসারিত করতে হবে। del person.siblings[:] person.siblings.extend([Person(), Person()])
নীল


4
অ্যারে (বা তালিকা) হিসাবে প্রসারিত করার জন্য আর্গুমেন্টগুলি পাস করার কথা মনে রাখবেন, যদি আপনার প্রয়োজন হয় তবে তাদের বন্ধনী দিয়ে মুড়িয়ে দিন!
নিকোলাস জেনেটেল

35

আপনি যদি প্রসারিত করতে বা এটি সম্পূর্ণরূপে ওভাররাইট করতে না চান তবে আপনি এটি করতে পারেন:

person.id[:] = [1, 32, 43432]

এই পদ্ধতির ক্ষেত্রটি পুরোপুরি পরিষ্কার করার জন্যও কাজ করবে:

del person.id[:]

4
বারবার যৌগিক প্রকারের জন্য, আপনি person.id [:] = [xxx] প্রতিস্থাপনের জন্য ব্যবহার করতে পারবেন না। আপনাকে প্রথমে সেগুলি মুছতে হবে এবং তারপরে প্রসারিত করতে হবে
ospider

4

বারবার যৌগিক ধরণের জন্য এটি আমার পক্ষে কাজ করেছিল worked

del person.things[:]
person.things.extend([thing1, thing2, ..])

এই মন্তব্যগুলি থেকে নেওয়া কীভাবে পুনরাবৃত্তি ক্ষেত্রে বরাদ্দ করা যায়? পুনরাবৃত্তি ক্ষেত্রে নিযুক্ত কিভাবে?


0

প্রচুর ঘুম হারানোর পরে পুনরাবৃত্ত ক্ষেত্রের কাজ করার জন্য একটি মৌলিক উদাহরণ পাওয়ার চেষ্টা করার পরে অবশেষে আমি তা পেয়েছি।

সমস্যাটি:

  • বর্গক্ষেত্র এবং গুণক দুটি ফাংশন সহ একটি ক্যালকুলেটর.পি তৈরি করুন।
  • জিআরপিসি ব্যবহার করে, এর জন্য একটি প্রোটো ফাইল তৈরি করুন।
  • একটি সার্ভার, একটি ক্লায়েন্ট লিখুন।
  • সঠিক ফলাফল পেতে সার্ভারটি চালান এবং ক্লায়েন্টটি চালান।

প্রোটো ফাইল:

syntax = "proto3";

message Number {
    int32 value = 1;
}

message NumList {
    string name = 1;
    repeated Number nums = 2;
}

service Calculator {
    rpc Multiplier(NumList) returns (Number) {}
    rpc Square(Number) returns (Number) {}
}

বর্গক্ষেত্র অংশটি সহজ, তবে গুণকগুলির জন্য, আমি সংখ্যাগুলির একটি তালিকা পাস করতে চেয়েছিলাম (প্রোটো ফাইলে সংজ্ঞায়িত সংখ্যার মতো)।

সমস্যাটি ছিল বারবার ক্ষেত্রের সাথে। এবং এখানে সংক্ষেপে চূড়ান্ত সমাধান।

সমাধান:

import grpc

# import the generated classes
import calculator_pb2
import calculator_pb2_grpc
# open a gRPC channel
channel = grpc.insecure_channel('localhost:50051')

# create a stub (client)
stub = calculator_pb2_grpc.CalculatorStub(channel)
num_list = calculator_pb2.NumList()
num_list.name = 'MyFirstList'
n1 = num_list.nums.add()
n2 = num_list.nums.add()
n3 = num_list.nums.add()
n1.value = 10
n2.value = 20
n3.value = 30

assert len(num_list.nums) == 3

response = stub.Multiplier(num_list)
print(response.value)

ক্যালকুলেটর মাল্টিপ্লায়ার ফাংশন (কারণ এটি দেখানো দরকার):

def multiplier(numlist, name):
    mul = 1
    for num in numlist:
        mul = mul * num.value
    print(f'Result of list {name}')
    return mul

আশা করি এটি কাউকে সাহায্য করবে। আশা করি এটি যেমন বর্ণনামূলক হবে তেমনি হওয়া উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.