Argomenti della stringa di threading Python


156

Ho un problema con il threading di Python e l'invio di una stringa negli argomenti.

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

.

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

Dove dRecieved è la stringa di una riga letta da una connessione. Chiama una semplice funzione che al momento ha solo un lavoro di stampa "ciao".

Comunque ottengo il seguente errore

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 è la lunghezza della stringa che sto cercando di passare, quindi immagino che si spezzi in ogni personaggio e cerchi di passare argomenti del genere. Funziona bene se chiamo semplicemente la funzione normalmente, ma vorrei davvero configurarla come thread separato.


49
Perché hai un punto e virgola alla fine di ogni riga?
Maikflow,

@Maikflow Non è una buona pratica? ASI converte le linee non punto e virgola in punto e virgola in background in background.
IK

Risposte:


296

Stai cercando di creare una tupla, ma stai solo tra parentesi una stringa :)

Aggiungi un ulteriore ",":

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

Oppure usa le parentesi per creare un elenco:

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

Se noti, dalla traccia dello stack: self.__target(*self.__args, **self.__kwargs)

Il *self.__argstrasforma la tua stringa in un elenco di caratteri, passandoli alla processLine funzione. Se gli passi un elenco di un elemento, passerà quell'elemento come primo argomento - nel tuo caso, la stringa.


1
parentesi extra alla fine della riga due del secondo blocco di codice. Volevo modificarlo, ma è meno di 6 caratteri
Harmonickey

Se hai arg2 con il valore predefinito, fallo. threading.Thread(target=thread_function, args=(arg1,),kwargs={'arg2': arg2})
DeveScie il

8

Spero di fornire maggiori conoscenze di base qui.

Innanzitutto, firma del costruttore del metodo threading :: Thread :

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

args è l'argomento tupla per l'invocazione di destinazione. Il valore predefinito è ().

In secondo luogo, una stranezza in Python su tuple:

Le tuple vuote sono costruite da una coppia vuota di parentesi; una tupla con un elemento viene costruita seguendo un valore con una virgola (non è sufficiente racchiudere un singolo valore tra parentesi).

D'altra parte, una stringa è una sequenza di caratteri, come 'abc'[1] == 'b'. Quindi, se si invia una stringa a args, anche tra parentesi (ancora una puntura), ogni carattere verrà trattato come un singolo parametro.

Tuttavia, Python è così integrato e non è come JavaScript in cui è possibile tollerare argomenti aggiuntivi. Invece, lancia un TypeErrorper lamentarsi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.