Does python support multi prototype.

Peter Hansen peter at engcorp.com
Wed Aug 4 10:20:53 EDT 2004


Jorgen Grahn wrote:

> Yes, but that's not as elegant in cases where the arguments' types has to
> trigger very different processing. I can even imagine situations where
> foo(S) and a foo(T) do completely different things, and still 'foo' is the
> best name for both of them.
> 
> I miss overloading in Python from time to time, but I can live without it.
> It is, after all, closely tied to a type system which is desirable in C++
> and Java, but not in Python.

(untested code, may be minor bugs)

def _foo_S(arg):
     # do something with arg, which is an S

def _foo_T(arg):
     # do something with arg, which is a T

def _foo_whatever(arg):
     # do something with arg when it's a "whatever"

     # ad nauseum...

def foo(arg):
     '''generic dispatcher for foo() function'''
     try:
         func = globals()['_foo_%s' % type(arg).__name__]
     except KeyError:
         raise TypeError('invalid type for function foo', arg)
     else:
         func(arg)


If you _really_ miss it from time to time, then it's _really_
easy to add it so that it's available in a fairly elegant fashion
when you do need it.

The above won't handle old-style classes, but adding support
for them would be pretty trivial too.  (Just need to check for
the case where the type is "instance" and use arg.__class__
instead of type(arg).)

-Peter



More information about the Python-list mailing list