Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

decorateur X setinterval

+2 votes

Voici un premier code qui permet de répéter une action à intervalle régulier:

import threading     

def dire_HELLO():
    print("\n HELLO")

def set_interval(func, sec):
    def func_wrapper():
        set_interval(func, sec)
        func() 
    t = threading.Timer(sec, func_wrapper)
    t.start()
    return(t)

Saluer = set_interval(dire_HELLO,2)

Voici un deuxième code, avec un décorateur joliment piqué sur la tête d'une fonction:

import threading
from functools import wraps

def delay(interval):
    """Decorator function which triggers
    the decorated function in `interval` seconds"""
    def delay_wrapper(func):
        @wraps(func)
        def func_wrapper(*args, **kwargs):
            t = threading.Timer(interval, func, args=args, kwargs=kwargs)
            t.start()
        return func_wrapper
    return delay_wrapper

@delay(2)
def say(*args, **kwargs):
    print(*args)

say("Hello", "à tous")

Ma question est comment ré-écrire le premier code, de façon à ce qu'il fasse exactement la même chose que l'original, mais qu'il puisse être appelé avec cette forme:

@magnifiqueDECORATEUR(argument_si_necessaire)
functionSUPERinteressante(argument_si_besoin)
demandé 8-Fev-2016 par buffalo974 (2,940 points)
edité 8-Fev-2016 par buffalo974

1 Réponse

+4 votes
 
Meilleure réponse

Ceci devrait correspondre a ce que tu souhaites faire:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import threading

def set_interval(sec):
    def interval_wrapper(func):
        def func_wrapper(*args, **kwargs):
            func(*args, **kwargs)
            t = threading.Timer(sec, func_wrapper, args=args, kwargs=kwargs)
            t.start()
        return func_wrapper
    return interval_wrapper

@set_interval(2)
def dire_HELLO(*args, **kwargs):
    print(args, kwargs)

dire_HELLO("Hello", name="Mr. buffalo974")
répondu 8-Fev-2016 par barnumbirr (2,750 points)
sélectionné 8-Fev-2016 par buffalo974
...