2013-05-03 3 views
13

मैं एक यूडीपी सॉकेट भेजने के लिए एक ही बफर में एक सूची में सभी डेटा पैक करना चाहता हूं। सूची अपेक्षाकृत लंबी है, इसलिए सूची में प्रत्येक तत्व को अनुक्रमणित करना कठिन है।पायथन struct.pack()?

NumElements = len(data) 
buf = struct.pack('d'*NumElements,data[0],data[1],data[2],data[3],data[4]) 

लेकिन मैं कुछ अधिक pythonic की आवश्यकता नहीं है कि मैं कॉल बदल अगर मैं सूची में और अधिक तत्वों को जोड़ा गया ... की तरह कुछ करना चाहते हैं:

यह वही है मैं अब तक किया है
NumElements = len(data) 
buf = struct.pack('d'*NumElements,data) # Returns error 

क्या ऐसा करने का कोई अच्छा तरीका है ??

उत्तर

15

हां, आप *args कॉलिंग वाक्यविन्यास का उपयोग कर सकते हैं।

इसके बजाय इस बात का

:

buf = struct.pack('d'*NumElements,data) # Returns error 

... ऐसा करते हैं:

buf = struct.pack('d'*NumElements, *data) # Works 

ट्यूटोरियल में Unpacking Argument Lists देखें। (लेकिन वास्तव में, खंड 4.7 के सभी, बस 4.7.4 नहीं पढ़ा है, या आप को पता नहीं होगा क्या "रिवर्स स्थिति ..." करने के लिए बात कर रहा है ...) संक्षेप में:

... जब बहस एक में पहले से ही कर रहे हैं सूची या टपल लेकिन बात यह है कि मैं सिर्फ जो चाहते हैं उसे एक समारोह कॉल अलग स्थितीय तर्कों की आवश्यकता होती है के लिए पैक किया जा करने के ... * -operator साथ समारोह कॉल बारे में किसी सूची या टपल से बाहर बहस खोल करने की जरूरत है ...

+0

आह! धन्यवाद! – user1636547

+1

'डी '* न्यूमलीमेंट्स' बहुत अच्छा अभ्यास नहीं है, यह एक बहुत बड़ी स्ट्रिंग बनाने के लिए समाप्त हो सकता है, केवल समय पार्सिंग बर्बाद करने के लिए, केवल बाद में मुक्त करने के लिए। इसके बजाय स्ट्रिंग में सीधे संख्या शामिल करें: 'buf = struct.pack (" {0: d} d ".format (NumElements), * डेटा)' – ideasman42

+0

@ ideasman42: अच्छा बिंदु। लेकिन मूल्यों की एक बड़ी संख्या के साथ, 500000 तर्कों में उन्हें अनपॅक करने से 'डी' * 500000 गुजरने की समस्या हो सकती है, इसलिए आप इसे 'बी' के खिलाफ परीक्षण करना चाहेंगे। (Struct.pack ('d' , elem) डेटा में elem के लिए) ', या' struct' के बजाय 'array 'या' ctypes' जैसे कुछ का उपयोग करने पर विचार करें। – abarnert