Related Articles

Related Articles

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.

filter_none

edit
close

play_arrow

link
brightness_4
code

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'])

chevron_right


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 –



filter_none

edit
close

play_arrow

link
brightness_4
code

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))

chevron_right


Output :

2.34
4.90

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

filter_none

edit
close

play_arrow

link
brightness_4
code

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

chevron_right


Output :

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

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

filter_none

edit
close

play_arrow

link
brightness_4
code

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

chevron_right


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.




My Personal Notes arrow_drop_up
Recommended Articles
Page :