Аргументы строки 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
, чтобы жаловаться.