Bienvenue sur IndexError.

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

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

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,886 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
...