Bonjour,

J'essaie de lancer un processus (en python 3.5) qui devrait exécuter une fonction décorée, mais ça ne marche pas.
Voici le message d'erreur qui s'affiche:

AttributeError: Can't pickle local object 'deco.<locals>.fonctionDecoree'
La fonction décorée semble donc ne plus être une fonction à proprement parler. Or, en dehors de mon processus elle se comporte tout à fait comme une fonction.

Voici un bout de code ayant pour but de résumer la situation. Si vous l'exécuter une fois avec "@deco" activé, et une fois avec "@deco" en commentaire, ça devrait devenir clair.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
from multiprocessing import Process
 
def deco(fonction):
    def fonctionDecoree():
        print("La fonction qu'on appelle a été décorée.")
        fonction()
    return fonctionDecoree
 
@deco
def fonctionTest():
    print("On appelle la fonction d'essai.")
 
if __name__ == "__main__":
 
    print("Le type de la fonction d'essai:")
    print(type(fonctionTest))
    print("--------------------------------\n")
 
    fonctionTest()
    print("--------------------------------\n")
 
    print("Démarrage d'un processus exécutant la fonction:")
    p = Process(target=fonctionTest)
    p.start() # La méthode qui fait planter le code quand @deco est activé.
    print("Le processus a bien été démarré.")
Pour moi cette situation n'est pas tellement un problème, mais plutôt un comportement inattendu que j'ai rencontré un peu par hasard, en faisant des essais.
Pourtant j'aimerais savoir d'où ça vient, parce que j'aime beaucoup utiliser les décorateurs, et ce n'est pas la première fois que leur étrange comportement me prend au dépourvu. Merci d'avance de m'aider.