2012-10-24 4 views
1

Je suis en train de faire quelque chose comme ceci:Appel d'une fonction au sein d'une fermeture en python

import threading 
def func1(a,b): 
    def func2(): 
     t=threading.Thread(target=func3) 
     return t 
    return func2 

func2=func1(a,b) 
func2() 

J'ai une restriction (la langue que je utilise est python avec des fonctions limitées) ne pas utiliser le paramètre args pour la fonction Thread à la place je veux passer a et b comme paramètres à func3. Comment puis-je faire cela en utilisant des fermetures?

+0

Je pense que vous voulez dire 'func2()' et non 'func1()'. –

Répondre

2

En l'absence de lambda je pourrais regarder dans functools.partial. Si cela n'est pas autorisé, vous pouvez probablement faire:

import threading 
def func1(a,b): 
    def func2(): 
     def func4(): 
      return func3(a,b) 
     return threading.Thread(target=func4) 
    return func2 

func2=func1(a,b) 
func2() 
+0

Cela fonctionne juste parfait pour ce que je suis en train de faire .. J'ai un peu de confusion ici: Comment puis-je attraper l'objet de fil retourné par le instruction 'threading.Thread (target = func4)' – securecoding

+0

Au lieu de faire 'func2()' à la dernière ligne, vous feriez 'thread_object = func2()' – mgilson

5

Vous pouvez utiliser un lambda:

t=threading.Thread(target=lambda: func3(a,b)) 

Les valeurs de a et b aura lieu dans une fermeture, même après func1 sorties.

Au lieu d'un lambda, vous pouvez créer une fonction nommée:

def thread_func(): 
    func3(a,b) 
t = threading.Thread(target=thread_func) 
+0

oh oui .. srry .. Je voulais dire func2() là .. édité maintenant – securecoding

+0

Je crains que l'utilisation de lambda ne soit pas autorisée aussi bien .. Puis-je le faire d'une autre manière? – securecoding

+0

@securecoding - Pouvez-vous utiliser 'functools.partial'? – mgilson

Questions connexes