बार-बार फील्ड में कैसे असाइन करें?


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यदि फ़ील्ड कच्चे प्रकार (जैसे स्ट्रिंग, int32, आदि) के बजाय फ़ील्ड संदेश प्रकार है, तो काम नहीं करता है। extendसंदेश प्रकारों के लिए काम करता है।
abeboparebop

4
यदि आप बार-बार संदेश प्रकार के क्षेत्र को अधिलेखित करना चाहते हैं तो आपको पहले हटाने और फिर विस्तार करने की आवश्यकता है। del person.siblings[:] person.siblings.extend([Person(), Person()])
नील


1
एक सरणी (या सूची) के रूप में विस्तार करने के लिए तर्कों में पारित करने के लिए याद रखें, यदि आवश्यक हो तो उन्हें कोष्ठक के साथ लपेटें!
निकोलस जेंटाइल

35

यदि आप विस्तार नहीं करना चाहते हैं, लेकिन इसे पूरी तरह से अधिलेखित कर सकते हैं, तो आप कर सकते हैं:

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

यह दृष्टिकोण पूरी तरह से क्षेत्र को खाली करने के लिए भी काम करेगा:

del person.id[:]

3
बार-बार मिश्रित प्रकारों के लिए, आप प्रतिस्थापित करने के लिए person.id [:] = [xxx] का उपयोग नहीं कर सकते। आपको पहले उन सभी को हटाना होगा और फिर विस्तार करना होगा
ospider

4

बार-बार मिश्रित प्रकार के लिए यह वही है जो मेरे लिए काम करता है।

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

आशा है कि यह किसी की मदद करता है। आशा है कि यह वर्णनात्मक है जैसा कि यह होना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.