Decorator for Enforcing Argument Types

John Machin sjmachin at lexicon.net
Fri Dec 22 02:50:47 EST 2006


George Sakkis wrote:
> John Machin wrote:
> > Bruno Desthuilliers wrote:
> >
> > > <my humble opinion>
> > > Python is dynamic, and fighting against the language is IMHO a really
> > > bad idea. The only places where theres a real need for this kind of
> > > stuff are when dealing with the "outside world" (IOW : inputs and
> > > outputs). And then packages like formencode can do much more than mere
> > > type-checking
> > > </my humble opinion>
> >
> > Agreed. The worst case I have seen:
> >
> > An elaborate decorator (similar to the OP's) laboriously checks arg
> > types. That's IMHO not "consenting adults" territory. But it gets a
> > whole lot worse when it's applied to a method whose body is like this:
> >
> > 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.




More information about the Python-list mailing list