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