Faites-vous des «décorateurs»? Embarrassant, j'ai appris les détails ** aujourd'hui **. Même si j'ai remarqué son existence, je l'ai ignorée jusqu'à aujourd'hui, mais depuis que je l'ai étudiée, j'écris avec l'intention de sortir quelque chose.
Immédiatement, j'ai essayé de faire quelque chose comme ça.
deco_test.py
def decof(Func,*_args,**_kwargs):
def _deco(func):
def wrapper(*args,**kwargs):
return Func(func(*args,**kwargs),*_args,**_kwargs)
return wrapper
return _deco
def decob(Func,*_args,**_kwargs):
def _deco(func):
def wrapper(*args,**kwargs):
return Func(*_args,func(*args,**kwargs),**_kwargs)
return wrapper
return _deco
En gros, vous pouvez créer une fonction ** qui permet à la fonction spécifiée de recevoir la valeur de retour de la fonction à encapsuler.
Il y en a deux car il est utilisé correctement selon que la valeur de retour est reçue comme premier argument (decof ()
) ou comme dernier argument (decob ()
).
C'est difficile à comprendre avec des mots, alors quand je le démontre,
deco_test.py
import numpy as np
from functools import reduce
from operator import sub
@decob(reduce,sub)
@decof(np.array,dtype=int)
@decof(list)
@decof(str)
@decob(pow,2)
@decof(pow,2)
def add(a,b):return a+b
print(add(3,4))
production
-55
#3+4 -> 7**2 -> 2**49 -> '562949953421312' -> ['5', '6', '2', '9', '4', '9', '9', '5', '3', '4', '2', '1', '3', '1', '2']
# -> array([5, 6, 2, 9, 4, 9, 9, 5, 3, 4, 2, 1, 3, 1, 2]) -> 5-6-2-9-4-9-9-5-3-4-2-1-3-1-2 -> -55
Vous pouvez exprimer clairement (?) Un relais de fonction comme celui-ci. c'est tout.
Je l'ai évité jusqu'à présent, mais cela semble assez pratique en fonction de la façon dont il est utilisé, donc si vous trouvez quelque chose à nouveau, j'aimerais le présenter ici. Merci d'avoir lu jusqu'au bout.
Recommended Posts