Python Diş Dizesi Bağımsız Değişkenleri


156

Python iş parçacığı ve bağımsız değişkenlerde bir dize gönderme ile ilgili bir sorun var.

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

.

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

Burada dRecieved, bir bağlantı tarafından okunan bir satırın dizesidir. Şu anda sadece "merhaba" yazdırma işi olan basit bir işlevi çağırıyor.

Ancak aşağıdaki hatayı alıyorum

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 geçirmeye çalıştığım dize uzunluğu, bu yüzden her karakter içine onu parçalamak ve böyle argümanlar geçirmeye çalışıyor sanırım. Sadece işlevi normal çağırırsanız iyi çalışır, ancak gerçekten ayrı bir iş parçacığı olarak ayarlamak istiyorum.


49
Neden her satırın sonunda noktalı virgül var?
Maikflow

@Maikflow Bu iyi bir uygulama değil mi? ASI noktalı virgül içermeyen çizgileri arka planda afaik noktalı virgül haline dönüştürür.
IK

Yanıtlar:


296

Bir demet oluşturmaya çalışıyorsunuz, ancak sadece bir dizeyi parantez içine alıyorsunuz :)

Fazladan bir ',' ekleyin:

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

Veya liste yapmak için parantez kullanın:

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

Dikkat ederseniz, yığın izlemeden: self.__target(*self.__args, **self.__kwargs)

*self.__argsOnları geçen karakterlerin bir listesi halinde dize döner processLine fonksiyonu. Bir öğe listesini iletirseniz, bu öğeyi ilk argüman olarak (sizin durumunuzda dize) geçirir.


1
ikinci kod bloğunun ikinci satırının sonunda fazladan parantezler. Düzenlemek istedim ama 6 karakterden daha az
harmonickey

Varsayılan değerle arg2'niz varsa bunu yapın. threading.Thread(target=thread_function, args=(arg1,),kwargs={'arg2': arg2})
DeveScie

8

Burada daha fazla arka plan bilgisi sağlamayı umuyorum.

İlk olarak, threading yönteminin yapıcı imzası :: Konu :

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

args ,hedef çağırma içinbağımsız değişken grubudur . Varsayılan değer ().

İkincisi, Python'da bir tuhaflıktuple :

Boş tuples, boş bir parantez çifti ile oluşturulur; bir öğe içeren bir demet, virgülle bir değer izlenerek oluşturulur (tek bir değeri parantez içine almak yeterli değildir).

Öte yandan, bir dize, bir karakter dizisidir 'abc'[1] == 'b'. Bu nedenle argsparantez içinde (hala bir acı) bile bir dize gönderirseniz , her karakter tek bir parametre olarak değerlendirilir.

Ancak, Python o kadar entegredir ve fazladan argümanların tolere edilebildiği JavaScript gibi değildir. Bunun yerine, bir TypeErrorşikayet atar .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.