पायथन थ्रेडिंग स्ट्रिंग तर्क


156

मुझे पायथन थ्रेडिंग और तर्कों में एक स्ट्रिंग भेजने के साथ एक समस्या है।

def processLine(line) :
    print "hello";
    return;

dRecieved = connFile.readline();
processThread = threading.Thread(target=processLine, args=(dRecieved));
processThread.start();

जहां dRecieve एक कनेक्शन द्वारा पढ़ी गई एक पंक्ति का स्ट्रिंग है। यह एक साधारण कार्य कहता है जो अभी "हेल्लो" छापने का केवल एक काम है।

हालाँकि मुझे निम्न त्रुटि मिलती है

Traceback (most recent call last):
File "C:\Python25\lib\threading.py", line 486, in __bootstrap_inner
self.run()
File "C:\Python25\lib\threading.py", line 446, in run
self.__target(*self.__args, **self.__kwargs)
TypeError: processLine() takes exactly 1 arguments (232 given)

232 उस स्ट्रिंग की लंबाई है जिसे मैं पास करने की कोशिश कर रहा हूं, इसलिए मुझे लगता है कि इसे प्रत्येक चरित्र में तोड़ दिया जाए और इस तरह तर्क को पारित करने की कोशिश की जाए। यह ठीक काम करता है अगर मैं केवल फ़ंक्शन को सामान्य रूप से बुलाता हूं, लेकिन मैं वास्तव में इसे एक अलग धागे के रूप में स्थापित करना चाहूंगा।


49
प्रत्येक पंक्ति के अंत में आपके पास अर्धविराम क्यों हैं?
2:25 बजे Maikflow

@Maflowflow एक अच्छा अभ्यास नहीं है? ASI पृष्ठभूमि में अफोकोमोन्डेड लाइनों को अर्धवृत्त में परिवर्तित नहीं करता है।
IK 11

जवाबों:


296

आप एक टपल बनाने की कोशिश कर रहे हैं, लेकिन आप सिर्फ एक स्ट्रिंग को छोटा कर रहे हैं :)

एक अतिरिक्त जोड़ें ',':

dRecieved = connFile.readline()
processThread = threading.Thread(target=processLine, args=(dRecieved,))  # <- note extra ','
processThread.start()

या सूची बनाने के लिए कोष्ठक का उपयोग करें:

dRecieved = connFile.readline()
processThread = threading.Thread(target=processLine, args=[dRecieved])  # <- 1 element list
processThread.start()

यदि आप देखें, स्टैक ट्रेस से: self.__target(*self.__args, **self.__kwargs)

*self.__argsवर्णों की एक सूची में अपने स्ट्रिंग बदल जाता है, उन्हें गुजर processLine कार्य करते हैं। यदि आप इसे एक तत्व सूची में पास करते हैं, तो यह उस तत्व को पहले तर्क के रूप में पारित करेगा - आपके मामले में, स्ट्रिंग।


1
दूसरे कोड ब्लॉक की लाइन दो के अंत में अतिरिक्त कोष्ठक। मैं इसे संपादित करना चाहता था, लेकिन यह कम है कि 6 अक्षर
harmonickey

यदि आपके पास डिफ़ॉल्ट मान के साथ arg2 है, तो ऐसा करें। threading.Thread(target=thread_function, args=(arg1,),kwargs={'arg2': arg2})
देवेस्की

8

मुझे यहां अधिक पृष्ठभूमि ज्ञान प्रदान करने की उम्मीद है।

सूत्रण विधि के पहले, निर्माता के हस्ताक्षर :: सूत्र :

class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)

आर्ग्स लक्ष्य आह्वान के लिएतर्क टपल है । में चूक ()।

दूसरा, पायथन में एक विचित्रताtuple :

खाली टुपल्स का निर्माण कोष्ठकों की एक खाली जोड़ी द्वारा किया जाता है; एक आइटम के साथ एक टपल का निर्माण अल्पविराम के साथ एक मूल्य का पालन करके किया जाता है (यह कोष्ठक में एक मान को संलग्न करने के लिए पर्याप्त नहीं है)।

दूसरी ओर, एक स्ट्रिंग पात्रों का एक क्रम है, जैसे 'abc'[1] == 'b'। तो अगर argsकोष्ठक में (यहां तक ​​कि एक स्टिंग) भी स्ट्रिंग भेजते हैं , तो प्रत्येक वर्ण को एक एकल पैरामीटर के रूप में माना जाएगा।

हालाँकि, पायथन इतना एकीकृत है और जावास्क्रिप्ट की तरह नहीं है जहाँ अतिरिक्त तर्क बर्दाश्त किए जा सकते हैं। इसके बजाय, यह TypeErrorशिकायत करने के लिए एक फेंकता है ।

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