Skip to content
Related Articles

Related Articles

Improve Article

Function overloading with singledispatch-functools

  • Last Updated : 26 Mar, 2020

Single-dispatch generic function decorator transforms a function into a generic function, which can have different behaviours depending upon the type of its first argument. The decorated function acts as the default implementation. To add overloaded implementations to the function, use the register() attribute of the generic function. It is a decorator, taking a type parameter and decorating a function implementing the operation for that type.

Where there is no registered implementation for a specific type, its method resolution order is used to find a more generic implementation. The original function decorated with @singledispatch is registered for the base object type, which means it is used if no better implementation is found.




from functools import singledispatch
  
@singledispatch
def fun(s):
    print(s)
  
@fun.register(int)
def _1(s):
    print(s * 2)
  
@fun.register(list)
def _2(s):
    for i, e in enumerate(s):print(i, e)
  
fun('GeeksforGeeks')
fun(10)
fun(['g', 'e', 'e', 'k', 's'])

Output :

GeeksforGeeks
20
0 g
1 e
2 e
3 k
4 s

The singledispatch decorator also supports decorator stacking. This allows us to create an overloaded function that can handle multiple types. Example –






from functools import singledispatch
from decimal import Decimal
  
@singledispatch
def fun(s):
    print(s)
  
@fun.register(float)
@fun.register(Decimal)
def _3(s):
    print(round(s, 2))
  
fun(2.34)
fun(Decimal(4.897))

Output :

2.34
4.90

dispatch() – To check which implementation will the generic function choose for a given type.




print(fun.dispatch(dict))
print(fun.dispatch(list))

Output :

<function fun at 0x0000022CFE62C7B8>
<function _2 at 0x0000022CFE77BA60>

registry() – read-only attribute to access all registered implementations.




print(fun.registry.keys())
print(fun.registry[int])
print(fun.registry[object])

Output :

dict_keys([<class 'object'>, <class 'int'>, <class 'list'>])
<function _1 at 0x0000018E5480B9D8>
<function fun at 0x0000018E546BC7B8>

 Attention geek! Strengthen your foundations with the Python Programming Foundation Course and learn the basics.  

To begin with, your interview preparations Enhance your Data Structures concepts with the Python DS Course. And to begin with your Machine Learning Journey, join the Machine Learning – Basic Level Course




My Personal Notes arrow_drop_up
Recommended Articles
Page :