Interesting Thread Gotcha

Hendrik van Rooyen mail at microcorp.co.za
Thu Jan 17 09:22:26 EST 2008


"Diez B. Roggisch" <dee,,eb.de> wrote:
> Hendrik van Rooyen wrote:
> > It would have been nice, however, to have gotten something like:
> > 
> > TypeError - This routine needs a tuple.
> > 
> > instead of the silent in line calling of the routine in question,
> > while failing actually to start a new thread.
> 
> You can't prevent the silent inline-calling - otherwise, how would you do
> this:
> 
> def compute_thread_target():
>     def target():
>         pass
>     return target
> 
> thread.start_new_thread(compute_thread_target())
> 
> 
> Of course start_new_thread could throw an error if it got nothing callable
> as first argument. No idea why it doesn't.

Thanks - got it, I think. Doesn't mean I like it, though:

>>> a = 42
>>> b = 24
>>> def do_something(c,d):
 print c
 print d

>>> do_something(a,b)
42
24

>>> def harmless():
 return a

>>> def evil():
 while True:
  pass

>>> do_something(a)
Traceback (most recent call last):
  File "<pyshell#15>", line 1, in ?
    do_something(a)
TypeError: do_something() takes exactly 2 arguments (1 given)
>>> do_something(harmless())
Traceback (most recent call last):
  File "<pyshell#17>", line 1, in ?
    do_something(harmless())
TypeError: do_something() takes exactly 2 arguments (1 given)
>>>do_something(evil())


This hangs and needs OS intervention to kill it - and there is also just
one argument, not two.

Looks like the arguments are handled one by one without validation
till the end. Lets see:

>>> do_something(a,b,harmless())
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in ?
    do_something(a,b,harmless())
TypeError: do_something() takes exactly 2 arguments (3 given)

So far, so good.

>>>do_something(a,b,evil())

This also hangs - the third, extra argument is actually called!

Are you all sure this is not a buglet?

- Hendrik





More information about the Python-list mailing list