2011-03-29 17 views
17

içinde Threading içinde TypeError alırsınız Bu kod, burada SO üzerinde bulunan bir örnek dayanır, ancak ben çalıştırdığınızda bir hata alıyorum. eminim, yardım edin onun çok basit:Neden Python

def listener(port): 
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    sock.bind(('',port)) 
    sock.settimeout(1) # n second(s) timeout 
    try: 
     while True: 
      data, addr = sock.recvfrom(1024) 
      print data 
    except socket.timeout: 
     print 'Finished' 

def startListenerThread(port): 
    threading.Thread(target=listener, args=(port)).start() 

i almak hatadır:

hata şu hattan geliyor
Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 522, in __bootstrap_inner 
    self.run() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 477, in run 
    self.__target(*self.__args, **self.__kwargs) 
TypeError: listener() argument after * must be a sequence, not int 
+2

Bu soru başlığı, bir ThreadQ oluştururken "neden bir sıra olması gerektiğinden" neden "argüman almalıyım" gibi gerçek bir soru olmalı? ". Doğru soru adları insanların doğru soruları/yanıtları bulmasına yardımcı olur. – ecerulm

cevap

48

:

threading.Thread(target=listener, args=(port)).start() 

args parametre bir dizi olması gerekiyor, bence niyetiniz bir tuple kullanmaktır, ancak parantez içinde tek bir değer kaydırma bunu gerçekleştiremez. Burada bunu değiştirmek için gerekenler:

>>> (100) # this is just value 100 
100 
>>> (100,) # this is a tuple containing the value 100 
(100,) 
+0

Herkese teşekkürler cevaplar için: bir dakikada 3, bu ezici! – Chris

8
son satırında

, args=(port)args=port eşdeğer olduğu:

threading.Thread(target=listener, args=(port,)).start() 

İşte fark gösteren basit bir örnektir. port'u aşağıdaki gibi uygun bir tuple yerleştirmeniz gerekir: args=(port,).

>>> type((1)) 
<type 'int'> 
>>> type((1,)) 
<type 'tuple'> 

değişim yukarıda:

6

threading.Thread için args parametre tuple bir şeyler 1-eleman tanımlama grubu yapar parens olmadığını

threading.Thread(target=listener, args=(port)).start() 

Not olması gerekiyor, bu virgül var

için
threading.Thread(target=listener, args=(port,)).start() 
İlgili konular