Open In App

Function overloading with singledispatch-functools

Improve
Improve
Like Article
Like
Save
Share
Report

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>


Last Updated : 26 Mar, 2020
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads