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


156

У мене є проблема з нанизуванням 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 - це довжина рядка, яку я намагаюся пройти, тому я здогадуюсь, що вона розбиває його на кожен символ і намагається передавати такі аргументи. Це добре працює, якщо я просто викликаю функцію нормально, але я дуже хотів би встановити її як окремий потік.


49
Чому у вас є крапки з комою в кінці кожного рядка?
Maikflow

@Maikflow Хіба це не хороша практика? ASI перетворює не напівкольорові лінії в напівколонові у фоновому режимі afaik.
ІК

Відповіді:


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 символів
harmonickey

Якщо у вас arg2 зі значенням за замовчуванням, зробіть це. threading.Thread(target=thread_function, args=(arg1,),kwargs={'arg2': arg2})
DeveScie

8

Я сподіваюсь надати більше базових знань тут.

По-перше, підпис конструктора методу нитки :: Нитка :

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

арг аргумент кортеж для цільового виклику. За замовчуванням ().

По-друге, Вигадка в Python про tuple:

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

З іншого боку, рядок - це послідовність символів, як 'abc'[1] == 'b'. Отже, якщо надіслати рядок args, навіть у дужках (все-таки строк ), кожен символ буде розглядатися як один параметр.

Однак Python настільки інтегрований і не схожий на JavaScript, де можна допустити зайві аргументи. Натомість він кидає TypeErrorскаргу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.