Anónimo
Tengo un problema con el enhebrado de Python y el envío de una cadena en los argumentos.
def processLine(line) :
print "hello";
return;
.
dRecieved = connFile.readline();
processThread = threading.Thread(target=processLine, args=(dRecieved));
processThread.start();
Donde dRecieved es la cadena de una línea leída por una conexión. Llama a una función simple que, en este momento, solo tiene un trabajo de impresión de “hola”.
Sin embargo me sale el siguiente error
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 es la longitud de la cadena que estoy tratando de pasar, así que supongo que la dividirá en cada carácter y tratará de pasar los argumentos de esa manera. Funciona bien si solo llamo a la función normalmente, pero realmente me gustaría configurarlo como un hilo separado.
Esteban
Estás tratando de crear una tupla, pero solo estás entre paréntesis en una cadena 🙂
Agregue un ‘,’ adicional:
dRecieved = connFile.readline()
processThread = threading.Thread(target=processLine, args=(dRecieved,)) # <- note extra ','
processThread.start()
O use corchetes para hacer una lista:
dRecieved = connFile.readline()
processThread = threading.Thread(target=processLine, args=[dRecieved]) # <- 1 element list
processThread.start()
Si observa, desde el seguimiento de la pila: self.__target(*self.__args, **self.__kwargs)
El *self.__args
convierte su cadena en una lista de caracteres, pasándolos al processLine
función. Si le pasa una lista de un elemento, pasará ese elemento como el primer argumento, en su caso, la cadena.
-
paréntesis adicionales al final de la línea dos del segundo bloque de código. Quería editarlo pero tiene menos de 6 caracteres.
– clave armónica
9 de mayo de 2015 a las 1:57
-
Si tiene arg2 con valor predeterminado, haga esto.
threading.Thread(target=thread_function, args=(arg1,),kwargs={'arg2': arg2})
– EspiralDev
24 de enero de 2019 a las 7:40
-
¿Qué pasa con los argumentos con nombre?
– carkod
23 de agosto de 2021 a las 10:45
campo temático
Espero proporcionar más conocimientos básicos aquí.
Primero, la firma del constructor del método of enhebrar::Hilo:
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
argumentos es el argumento tupla para la invocación de destino. El valor predeterminado es ().
segundo, un capricho en Python sobre tuple
:
Las tuplas vacías se construyen con un par de paréntesis vacíos; una tupla con un elemento se construye siguiendo un valor con un coma (no es suficiente encerrar un solo valor entre paréntesis).
Por otro lado, una cadena es una secuencia de caracteres, como 'abc'[1] == 'b'
. Entonces, si envía una cadena a args
incluso entre paréntesis (todavía una picadura), cada carácter se tratará como un solo parámetro.
Sin embargo, Python está muy integrado y no es como JavaScript, donde se pueden tolerar argumentos adicionales. En su lugar, arroja un TypeError
quejarse.
from threading import Thread
from time import sleep
def run(name):
for x in range(10):
print("helo "+name)
sleep(1)
def run1():
for x in range(10):
print("hi")
sleep(1)
T=Thread(target=run,args=("Ayla",))
T1=Thread(target=run1)
T.start()
sleep(0.2)
T1.start()
T.join()
T1.join()
print("Bye")
-
La comunidad alienta a agregar explicaciones a las preguntas y no publicar respuestas puramente codificadas (ver aquí).
– costaparas
29 de diciembre de 2020 a las 4:58
¿Por qué tiene punto y coma al final de cada línea?
– Maikflow
21 de septiembre de 2015 a las 2:55
@Maikflow ¿No es una buena práctica? ASI convierte las líneas sin punto y coma en punto y coma en el fondo afaik.
– IK
1 oct 2019 a las 12:11
@IK Ver este stackoverflow.com/questions/19365508/…
– Maikflow
7 oct 2019 a las 20:36