Décorateur de filetage [Python]

Oct 27 2020

J'essaye de créer un programme simple en utilisant le socket python et la bibliothèque de threads. Je souhaite automatiser la procédure suivante à l'aide d'un décorateur:

t = threading.Thread(target=function, args=(arg1, arg2))
t.start()

le programme est structuré à l'aide de la POO, j'ai donc défini une sous-classe à l'intérieur de la principale pour contenir tous les décorateurs (j'ai lu cette méthode dans cet article: https://medium.com/@vadimpushtaev/decorator-inside-python-class-1e74d23107f6). Par conséquent, j'ai une situation comme celle-ci:

class Server(object):

    class Decorators(object):

        @classmethod
        def threaded_decorator(cls, function):
            def inner_function():
                function_thread = threading.Thread(target=function)
                function_thread.start()
            return inner_function

    def __init__(self, other_arguments):
        # other code
        pass

    @Decorators.threaded_decorator
    def function_to_be_threaded(self):
        # other code
        pass

Mais quand j'essaie de courir, je reçois l'erreur suivante: TypeError: function_to_be_threaded() missing one required argument: 'self'. Je soupçonne que le problème se trouve dans la partie lorsque j'appelle le threading.Thread (target = function) qui ne transmet pas en quelque sorte la fonction entière self.function_to_be_threaded. Par conséquent, si vous savez comment résoudre ce problème, pouvez-vous me le dire ?. Aussi, pouvez-vous me dire s'il existe un moyen d'implémenter un décorateur qui accepte l'argument qui passera à la classe Thread en tant que args=(arguments_of_the_decorator)?

Merci beaucoup pour votre temps et excusez mon anglais, je le pratique toujours

Réponses

1 napuzba Oct 27 2020 at 15:15

Utilisez la *argssyntaxe pour déplacer les arguments. En d'autres termes, utilisez *argspour collecter tous les arguments positionnels sous forme de tuple et déplacez-le threading.Threadcomme args.

import threading
import time
class Server(object):

    class Decorators(object):

        @classmethod
        def threaded_decorator(cls, function):
            def inner_function(*args):
                function_thread = threading.Thread(target=function,args=args)
                function_thread.start()
            return inner_function

    def __init__(self, count,sleep):
        self.count = count
        self.sleep = sleep

    @Decorators.threaded_decorator
    def function_to_be_threaded(self,id):
        for xx in range(self.count):
            time.sleep(self.sleep)
            print("{} ==> {}".format(id,xx))
           

>>> Server(6,1).function_to_be_threaded('a')
>>> Server(2,3).function_to_be_threaded('b')

a ==> 0
a ==> 1
a ==> 2
b ==> 0
a ==> 3
a ==> 4
a ==> 5
b ==> 1

voir aussi Comment puis-je passer des arguments d'une fonction à une autre?