¿Por qué una cadena entre paréntesis no forma una tupla con solo esa cadena? [duplicate]

3 minutos de lectura

Avatar de usuario de Anonymous
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.

  • ¿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


Avatar de usuario de Stephen
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

avatar de usuario de themefield
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 argsincluso 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

¿Ha sido útil esta solución?