Python Threading Строковые Аргументы

156

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

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

,

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

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

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

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
Почему у вас есть точки с запятой в конце каждой строки?
Maikflow
@ Maikflow Разве это не хорошая практика? ASI преобразует не точки с запятой в точку с запятой на заднем плане afaik.
IK
@IK Посмотреть этот stackoverflow.com/questions/19365508/…
Maikflow

Ответы:

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 символов
гармоника
Если у вас есть arg2 со значением по умолчанию, сделайте это. threading.Thread(target=thread_function, args=(arg1,),kwargs={'arg2': arg2})
SpiralDev
8

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

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

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

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

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

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

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

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

themefield
источник