Aujourd'hui, c'est les fonctions génériques de distribution unique (PEP-443). La fonction générique est souvent traduite comme une fonction générique, mais elle est utilisée légèrement différemment selon la langue. En Python, cela semble être utilisé pour signifier "donner le même nom à plusieurs fonctions qui se comportent différemment selon le type d'argument".
Je ne comprends pas du tout même si j'écris, alors je vais vous donner un exemple. Considérons une fonction dont la sortie diffère selon le type d'argument. Cela ressemble à ceci sans utiliser de fonctions génériques.
def print_func(arg):
arg_type = type(arg)
if arg_type is int:
print("found integer:", arg)
elif arg_type is list:
print("found list:", arg)
else:
print("found something:", arg)
print_func(1)
print_func(['a','b','c'])
print_func(1.23)
Traitez en vérifiant le type de l'argument d'entrée un par un avec l'instruction if. Le résultat de l'exécution est le suivant.
found integer: 1
found list: ['a', 'b', 'c']
found something: 1.23
Si vous écrivez ceci avec des fonctions génériques de distribution unique, ce sera comme ceci.
from functools import singledispatch
@singledispatch
def print_func(arg):
print("found something:", arg)
@print_func.register(int)
def _(arg):
print("found integer:", arg)
@print_func.register(list)
def _(arg):
print("found list:", arg)
print_func(1)
print_func(['a','b','c'])
print_func(1.23)
Cela ressemble à la modification de la fonction de base avec un seul décorateur de patch et à l'ajout d'un traitement pour chaque type à l'aide de la méthode register. Laquelle est la meilleure est subtile, mais si le traitement de chaque type devient plus long, cela peut être plus propre que de le mettre dans une instruction if.
Le résultat est le même que ci-dessus, il est donc omis.
Mais je ne vois aucune utilité. Il est courant de voir une certaine valeur et de la distribuer, par exemple, l'analyse d'un tel groupe de données, car le format des données qui suit peut être connu à partir de la valeur de Header. Dans un tel cas, il est souvent réalisé en préparant un Dict qui soustrait une fonction de la valeur, mais il s'agit d'un type.
Recommended Posts