Possible bug with TypeError in Python

Daniel Benden (IAC/IPO/OSP) daniel at osp.nl
Wed Jan 30 15:32:39 UTC 2008


Aaron Konstam wrote:
> On Wed, 2008-01-30 at 19:34 +0530, Anoop Chandran wrote:
>   
>> On Jan 30, 2008 7:28 PM, Mark C. Allman <mcallman at allmanpc.com> wrote:
>>         
>>         On Wed, 2008-01-30 at 07:40 -0600, Aaron Konstam wrote:
>>         > The following seems like an bug in python in both f7 and f8
>>         but I would
>>         > like input before I post a bugzilla. It seems the exception
>>         handler
>>         > cannot trap the TypeError in python.
>>         > For example:
>>         > def plus(a,b):
>>         >       try:
>>         >               return(a+b)
>>         >       except TypeError:
>>         >               return None
>>         >
>>         > If we define plus as above and call it with: plus(3,) we
>>         should get
>>         > nothing returned. Instead we get:
>>         > Traceback (most recent call last):
>>         >   File "./calculator", line 47, in <module>
>>         >     exec("register=op[tokens[0]](register)")
>>         >   File "<string>", line 1, in <module>
>>         > TypeError: plus() takes exactly 2 arguments (1 given)
>>         >
>>         > This seems like a bug. An ideas out there?
>>         > --
>>     
>
>   
>>         >
>>         
>>         If I remember right, the exception is occurring before the
>>         actual call
>>         into "plus()."  Try:
>>            plus(3,"My String");
>>         and you should see the TypeError.
>>
>>
>> try:
>>   a = plus(3)
>> except TypeError:
>>   a = 0
>> print a
>>
>> Output should be 0.
>>
>>     
> You are both correct but it still seems like a bug. Until you try to
> execute plus the system does not know that plus requires 2 arguments.
> But nevertheless a TypeError is generated  so the exception handler
> should be triggered.
>   
The exception is generated while calling  plus (as said before) so 
before your try/except. So its thrown right back at you and not caught.
> But you have given me further insight into the problem so I thank you
> all for that insight. 
>
> The question is how do I do what I want to do; that is, check that the number
>  of arguments to plus are correct? In the program in which I am using this
> construction  the function executed and the arguments are generated dynamically
> so doing this checking is necessary.
>   
Using default values might do the trick for you.


 >>> def plus(a=None, b=None):
...        try:
...             return a+b
...        except:
...             return None
...
 >>> print plus(3, )
None
 >>> print plus(3)
None
 >>> print plus(3,2)
5

Good luck
Daniel


 
> --
> =======================================================================
> Whether weary or unweary, O man, do not rest, Do not cease your
> single-handed struggle. Go on, do not rest. -- An old Gujarati hymn
> =======================================================================
> Aaron Konstam telephone: (210) 656-0355 e-mail: akonstam at sbcglobal.net
>
>   




More information about the fedora-list mailing list