How can an int be '+' with a tuple?

Jach Fong jfong at ms4.hinet.net
Sun Jun 3 00:32:07 EDT 2018


 > (For good reasons, attachments are dropped when messages are
distributed
 > on the forum.)

For whom who can not get the attachment:-)

###a simplified version of "Programming Python 4ed, Example 10-20.
import _thread as thread
import queue
threadQueue = queue.Queue(maxsize=0)

def queueChecker(widget, delayMsecs=100):
     try:
         (callback, args) = threadQueue.get(block=False)
     except queue.Empty:
         pass
     else:
         callback(*args)

     widget.after(delayMsecs,
         lambda: queueChecker(widget, delayMsecs)) # back to event loop

def threaded(action, args, context, onExit, onProgress):
     def progress(*any):
         threadQueue.put((onProgress, any + context))  # <--line 18
     action(progress=progress, *args)
     threadQueue.put((onExit, context))

def startThread(action, args, context, onExit, onProgress):
     thread.start_new_thread(
         threaded, (action, args, context, onExit, onProgress))

if __name__ == '__main__':
     import time
     import tkinter as tk

     def onEvent(i):  # code that spawns thread
         myname = 'thread-%s' % i
         startThread(
             action     = threadaction,
             args       = (i, 3),
             context    = (myname,),  # <-- line 35
             onExit     = threadexit,
             onProgress = threadprogress)

     # thread's main action
     def threadaction(id, reps, progress):
         for i in range(reps):
             time.sleep(1)
             progress(i)  # <--line 43, progress callback: queued

     # thread exit/progress callbacks: dispatched off queue in main thread
     def threadexit(myname):
         print('%s\texit' % myname)

     def threadfail(exc_info, myname):
         print('%s\tfail\t%s' % (myname, exc_info[0]))

     def threadprogress(count, myname):
         print('%s\tprog\t%s' % (myname, count))

     # make enclosing GUI and start timer loop in main thread
     # spawn batch of worker threads on each mouse click: may overlap
     root = tk.Tk()
     queueChecker(root)
     root.bind('<Button-1>',   # 3.x need list for map, range ok
               lambda event: list(map(onEvent, range(2))) )
     root.mainloop()


Ben Finney 於 2018/6/3 上午 11:57 寫道:
> Jach Fong <jfong at ms4.hinet.net> writes:
> 
>> The attached is a script
> 
> Thanks for making an example script. Instead of attaching it, please
> post it along with your message so that everyone can read it. You can
> make scripts suitable for posting in your message, by keeping them short
> and simple <URL:http://sscce.org/>.
> 
> (For good reasons, attachments are dropped when messages are distributed
> on the forum.)
> 
>> One thing make me puzzled is that the "any + context" at line
>> 18. The "any" was passed as an integer from line 43 and the "context"
>> was defined as a tuple at line 35. This concatenation works! how?
> 
> If the values are actually as you say, then Python should raise a
> TypeError. For example::
> 
>      >>> 1 + ("foo", "bar")
>      Traceback (most recent call last):
>        File "<stdin>", line 1, in <module>
>      TypeError: unsupported operand type(s) for +: 'int' and 'tuple'
> 
> What makes me suspect that's different from your code, is that you say
> “defined as a tuple”. Names in Python have no defined type; only an
> object has a type, and operations (like ‘+’ only take effect on the
> object, not the name.
> 

---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus




More information about the Python-list mailing list