Аргументы строки Threading Python

У меня проблема с потоковой обработкой Python и отправка строки в аргументы.

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

.

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

Где dRecieved - строка одной строки, считанная соединением. Он вызывает простую функцию, которая на данный момент имеет только одно задание печати "привет".

Однако я получаю следующую ошибку

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 - это длина строки, которую я пытаюсь передать, поэтому я предполагаю, что она разбивает ее на каждый символ и пытается передать такие аргументы. Он отлично работает, если я просто вызываю функцию нормально, но мне бы очень хотелось настроить ее как отдельный поток.

Ответ 1

Вы пытаетесь создать кортеж, но просто заключаете строку в скобки :)

Добавьте дополнительный ',':

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 функция. Если вы передадите ему список из одного элемента, он передаст этот элемент в качестве первого аргумента - в вашем случае, строку.

Ответ 2

Я надеюсь предоставить здесь дополнительные знания.

Во-первых, сигнатура конструктора метода threading :: Thread:

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

args - это аргумент tuple для целевого вызова. По умолчанию().

Во-вторых, причуда в Python о tuple:

Пустые кортежи состоят из пустой пары скобок; кортеж с одним элементом создается следующим образом: запятая (недостаточно заключить одно значение в скобки).

С другой стороны, строка - это последовательность символов, например, 'abc'[1] == 'b'. Поэтому, если отправить строку в args, даже в скобках (все еще в строке), каждый символ будет рассматриваться как один параметр.

Однако Python настолько интегрирован и не похож на JavaScript, где допустимы дополнительные аргументы. Вместо этого он бросает TypeError, чтобы жаловаться.