Decorator for Enforcing Argument Types

Duncan Booth duncan.booth at invalid.invalid
Fri Dec 22 04:29:48 EST 2006


"John Machin" <sjmachin at lexicon.net> wrote:

>> > if isinstance(....
>> >     action_for_type1(...
>> > # big snip
>> > elif isinstance(...
>> >     action_typeN( ...
>> > # no else statement
>>
>> Ouch.. someone must have skipped his/her OO class...
> 
> Quite possibly :-) but that's not the problem here.
> 
> The method in question might be called say emit_generic(self,
> any_type_of obj) and so one bunch of isinstance calls is actually
> needed, but not two bunches. So: lose the decorator and add an else and
> a raise at the end.
> 
> There is a secondary problem: annoying the crap out of callers who
> often know what type they have and want an emit_real which would take
> an int, a long, or a float and an emit_strg and ... (yes, almost all
> the possible types are that simple) which wouldn't go through even one
> chain of isinstance calls.
> 

I think the point that was being made was that the method's body should be 
something like:

   actions[type(arg)](...)

which not only avoids all of the isinstance calls but also the else and the 
raise at the end.



More information about the Python-list mailing list