Đối số chuỗi luồng của Python


156

Tôi có một vấn đề với luồng Python và gửi một chuỗi trong các đối số.

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

.

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

Trong đó dRecpered là chuỗi của một dòng được đọc bởi một kết nối. Nó gọi một chức năng đơn giản mà ngay bây giờ chỉ có một công việc in "xin chào".

Tuy nhiên tôi nhận được lỗi sau

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 là độ dài của chuỗi mà tôi đang cố gắng vượt qua, vì vậy tôi đoán nó sẽ chia nó thành từng ký tự và cố gắng truyền các đối số như thế. Nó hoạt động tốt nếu tôi chỉ gọi hàm bình thường nhưng tôi thực sự muốn thiết lập nó như một luồng riêng biệt.


49
Tại sao bạn có dấu chấm phẩy ở cuối mỗi dòng?
Maikflow

@Maikflow Không phải là một thực hành tốt? ASI chuyển đổi các dòng không bán tự động thành bán tự động trong nền afaik.
IK

Câu trả lời:


294

Bạn đang cố gắng tạo một tuple, nhưng bạn chỉ đang ngoặc đơn chuỗi :)

Thêm một dấu ',':

dRecieved = connFile.readline()
processThread = threading.Thread(target=processLine, args=(dRecieved,))  # <- note extra ','
processThread.start()

Hoặc sử dụng dấu ngoặc để tạo danh sách:

dRecieved = connFile.readline()
processThread = threading.Thread(target=processLine, args=[dRecieved])  # <- 1 element list
processThread.start()

Nếu bạn nhận thấy, từ dấu vết ngăn xếp: self.__target(*self.__args, **self.__kwargs)

Biến *self.__argschuỗi của bạn thành một danh sách các ký tự, chuyển chúng đến processLine hàm. Nếu bạn truyền cho nó một danh sách một phần tử, nó sẽ chuyển phần tử đó làm đối số đầu tiên - trong trường hợp của bạn là chuỗi.


1
dấu ngoặc đơn ở cuối dòng hai của khối mã thứ hai. Tôi muốn chỉnh sửa nó nhưng ít hơn 6 ký tự
hòa âm

Nếu bạn có arg2 với giá trị mặc định, hãy làm điều này. threading.Thread(target=thread_function, args=(arg1,),kwargs={'arg2': arg2})
DeveScie

7

Tôi hy vọng sẽ cung cấp thêm kiến ​​thức nền tảng ở đây.

Đầu tiên, chữ ký constructor của luồng của phương thức :: Thread :

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

args là đối số tuple cho lời gọi đích. Mặc định cho ().

Thứ hai, một câu đố trong Python về tuple:

Các bộ dữ liệu trống được tạo bởi một cặp dấu ngoặc rỗng; một tuple với một mục được xây dựng bằng cách tuân theo một giá trị bằng dấu phẩy (không đủ để đặt một giá trị trong ngoặc đơn).

Mặt khác, một chuỗi là một chuỗi các ký tự, như thế 'abc'[1] == 'b'. Vì vậy, nếu gửi một chuỗi đến args, ngay cả trong ngoặc đơn (vẫn là một sting), mỗi ký tự sẽ được coi là một tham số duy nhất.

Tuy nhiên, Python được tích hợp và không giống như JavaScript nơi các đối số bổ sung có thể được chấp nhận. Thay vào đó, nó ném một TypeErrorđể phàn nàn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.