Sobrecarga de funciones con singledispatch-functools

El decorador de función genérica de envío único transforma una función en una función genérica, que puede tener diferentes comportamientos según el tipo de su primer argumento. La función decorada actúa como la implementación predeterminada. Para agregar implementaciones sobrecargadas a la función, use el atributo register() de la función genérica. Es un decorador, tomando un parámetro de tipo y decorando una función implementando la operación para ese tipo.

Cuando no hay una implementación registrada para un tipo específico, se usa su orden de resolución de métodos para encontrar una implementación más genérica. La función original decorada con @singledispatch está registrada para el tipo de objeto base, lo que significa que se usa si no se encuentra una implementación mejor.

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

Producción :

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

El decorador de envío único también admite el apilamiento de decoradores. Esto nos permite crear una función sobrecargada que puede manejar múltiples tipos. Ejemplo –

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

Producción :

2.34
4.90

dispatch(): para verificar qué implementación elegirá la función genérica para un tipo dado.

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

Producción :

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

registro(): atributo de solo lectura para acceder a todas las implementaciones registradas.

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

Producción :

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

Publicación traducida automáticamente

Artículo escrito por naina024 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *