On 02/24/10 05:25, Michael Rudolf wrote: > Just a quick question about what would be the most pythonic approach in > this. > > In Java, Method Overloading is my best friend, but this won't work in > Python: <snip> > So - What would be the most pythonic way to emulate this? > Is there any better Idom than: > >>>> def a(x=None): > if x is None: > pass > else: > pass
Python's idiom for this has always been to use "if arg is None:"; but now with the (relatively) new decorator feature, though is not yet a popular idiom, it is now possible to do something like this: #!/usr/bin/env python from functools import wraps def overloaded(func): @wraps(func) def overloaded_func(*args, **kwargs): for f in overloaded_func.overloads: try: return f(*args, **kwargs) except TypeError: pass else: # it will be nice if the error message prints a list of # possible signatures here raise TypeError("No compatible signatures") def overload_with(func): overloaded_func.overloads.append(func) return overloaded_func overloaded_func.overloads = [func] overloaded_func.overload_with = overload_with return overloaded_func ############# @overloaded def a(): print 'a() without args' pass @a.overload_with def _(n): # note that, just like property(), the function's name in # the "def _(n):" line can be arbitrary, the important # name is in the "@overloads(a)" line print 'a() with args' pass a() a(4) a(4, 5) # ERROR: no matching signature PS: I posted the code to recipe book, for future reference: http://code.activestate.com/recipes/577064-simple-function-overloading-with-decorator/ -- http://mail.python.org/mailman/listinfo/python-list