J'ai deux décorateurs, @timeout et @retry le code est comme ça
@timeout(seconds=1)
def func_inner(expire):
time.sleep(expire)
@retry(
count=2,
message="Failed command after {expire} seconds",
)
def func(expire):
func_inner(expire)
Je veux juste savoir comment la méthode func () peut savoir que func_inner a un décorateur @timeout? Merci d'avance!
3 Réponses :
Ce code:
def func_inner(expire):
time.sleep(expire)
func_inner = timeout(seconds=1)(func_inner)
Est essentiellement égal à:
@timeout(seconds=1)
def func_inner(expire):
time.sleep(expire)
La méthode func appelle simplement func_inner (expire) , ce qui revient à appeler timeout (seconds = 1) (func_inner) (expire) puisque le décorateur a redéfini la fonction.
La détecter ne serait possible que grâce à un mécanisme spécifique défini par le décorateur lui-même. Un décorateur prend juste une fonction et renvoie un autre objet dans le cas général, et Python lui-même ne garde pas une trace de ce processus.
Oui, vous pouvez voir le wrapper à l'intérieur de la fonction, en utilisant inspect ou globals, et vous pouvez accéder directement à l'objet wrapper.
Voici un exemple simple montrant quelques façons de voir le wrapper à l'intérieur de la fonction. p >
in mywrapper ** myfunc inspect : mywrapper ** myfunc globals : mywrapper wrapper = <function mywrapper at 0x7f30df0e72a8> done myfunc wrapper = <function mywrapper at 0x7f30df0e72a8>
Ce qui précède s'imprime,
#!/usr/bin/python
import sys
import inspect
def mydecorator(func):
def mywrapper():
print( 'in mywrapper' )
func()
return mywrapper
@mydecorator
def myfunc():
felf = globals()[inspect.getframeinfo(inspect.currentframe()).function]
print("** myfunc inspect : %s"%felf.__name__)
felf = globals()[sys._getframe().f_code.co_name]
print("** myfunc globals : %s"%felf.__name__)
print( 'wrapper =' )
print( myfunc )
print( 'done myfunc' )
myfunc()
print( 'wrapper =' )
print( myfunc )
Notez que le nom n'est pas le nom de votre fonction, mais plutôt le wrapper . Consultez la documentation inspect et getframe pour en savoir plus sur les informations disponibles.
Copie possible de Comment un décorateur de fonction peut-il être attaché à la fonction à l'intérieur
D'accord, réponse finale, j'ai réédité et inclus trois façons simples de le faire en une seule ligne. Veuillez voir si cela fonctionne pour vous.