# Python: exec et "nested function"?

**URL:** <https://www.debian-fr.org/t/python-exec-et-nested-function/70125>\
**Category:** Programmation\
**Created:** [Juin 25, 2016, 3:34 UTC](https://www.debian-fr.org/t/python-exec-et-nested-function/70125 "2016-06-25T15:34:21Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![totola](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/3be4f8/32.png) [@totola](https://www.debian-fr.org/u/totola)\
**Post date:** [Juin 25, 2016, 3:34 UTC](https://www.debian-fr.org/t/python-exec-et-nested-function/70125/1 "2016-06-25T15:34:22Z")

</div>

Bonjour,  
j’ai un probleme avec exec sur la fonction suivante:

```
def ToutSelection():
     if retour19.get()==1:
         for i in range(1,19):
                        command="{0}{1}{2}".format('retour',str(i),'.set(1)') 
                        command2="{0}{1}{2}".format('self.canvas_image',str(i),'fond.configure(bg="#7aa0f6")')
                        exec command
                        exec command2 

```

Mais j’ai une erreur:

```
    exec command 
SyntaxError: unqualified exec is not allowed in function 'ToutSelection' because it is a nested function

```

j’ai trouvé ça mais je ne comprends pas ce que je dois changer…?

> <https://stackoverflow.com/questions/4484872/why-doesnt-exec-work-in-a-function-with-a-subfunction>

Je précise j’utilise python 2.7 et pas python 3 en effet…

MErci 🙂

---

<div class="post-metadata">

**Author:** ![Almtesh](https://www.debian-fr.org/user_avatar/www.debian-fr.org/almtesh/32/10312_2.png) [@Almtesh](https://www.debian-fr.org/u/Almtesh)\
**Post date:** [Juin 25, 2016, 11:44 UTC](https://www.debian-fr.org/t/python-exec-et-nested-function/70125/2 "2016-06-25T23:44:58Z")

</div>

D’après ce que je comprend de ce [sujet](http://stackoverflow.com/questions/1589058/nested-function-in-python), ta fonction ne peut pas utiliser exec car, faisant appel à des variables externe à elle, elle aquiert le statut de “nested”.  
Je n’ai pas bien compris le concept, mais tu peux toujours essayer de mettre les variables “retour19” en paramètre de la fonction et de passer cette variable lors de l’appel.

Je n’ai pas reçu à reproduire l’erreur, mais avec un contexte un peu moins vague (notament sur les valeurs des variables retour1 à retour19), je pourrais sans doute t’aider.

---

<div class="post-metadata">

**Author:** ![totola](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/3be4f8/32.png) [@totola](https://www.debian-fr.org/u/totola)\
**Post date:** [Juin 26, 2016, 7:23 UTC](https://www.debian-fr.org/t/python-exec-et-nested-function/70125/3 "2016-06-26T07:23:44Z")

</div>

Bonjour et merci de la réponse.  
Alors mes variables retour1 à 18 sont liées à des cases à cocher (0 déselectionnée et 1 sélectionnée). Retour19 est liée à une case particulière permettant de cocher toutes les autres si sélectionnée.  
Et l’histoire de rajouter in globals(), locals() comme dans le sujet que j’ai cité plus haut? Je n’ai pas bien compris cette histoire?  
Merci en tout cas  
Bonne journée

---

<div class="post-metadata">

**Author:** ![seb-ksl](https://www.debian-fr.org/user_avatar/www.debian-fr.org/seb-ksl/32/2946_2.png) [@seb-ksl](https://www.debian-fr.org/u/seb-ksl)\
**Post date:** [Juin 26, 2016, 8:27 UTC](https://www.debian-fr.org/t/python-exec-et-nested-function/70125/4 "2016-06-26T08:27:46Z")

</div>

Je contourne le problème, mais pourquoi ne pas utiliser le très recommandé module [subprocess](https://docs.python.org/2.7/library/subprocess.html) ?

---

<div class="post-metadata">

**Author:** ![Almtesh](https://www.debian-fr.org/user_avatar/www.debian-fr.org/almtesh/32/10312_2.png) [@Almtesh](https://www.debian-fr.org/u/Almtesh)\
**Post date:** [Juin 26, 2016, 8:43 UTC](https://www.debian-fr.org/t/python-exec-et-nested-function/70125/5 "2016-06-26T08:43:52Z")

</div>

[quote=“seb-ksl, post:4, topic:70125, full:true”]Je contourne le problème, mais pourquoi ne pas utiliser le très recommandé module subprocess ?[/quote]Tout simplement car il ne s’agit pas d’executer un sous-processus, mais de manipuler les variables.  
Je suis d’accord, ce n’est pas la meilleure façon de faire, mais là, le but est de faire fonctionner le truc si on le faire fonctionner autrement, on pourrait utiliser une liste ou un dictionnaire au lieu d’une série de variables, mais ce n’est pas du tout la question.

[quote=“totola, post:3, topic:70125”]Et l’histoire de rajouter in globals(), locals() comme dans le sujet que j’ai cité plus haut? Je n’ai pas bien compris cette histoire?[/quote]Je n’ai pas des compétences aussi avancée en Python, mais il me semble que locals() permet d’avoir la valeur de la variable pour le bloc courant (ta fonction), globals permet d’avoir la variable du module courant (du fichier).  
En gros, tu devrais appeller `globals () ['retour1']` au lieu de `retour1`, mais là encore, je ne suis pas sûr et je ne peux pas le tester.

---

<div class="post-metadata">

**Author:** ![totola](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/3be4f8/32.png) [@totola](https://www.debian-fr.org/u/totola)\
**Post date:** [Juin 26, 2016, 8:54 UTC](https://www.debian-fr.org/t/python-exec-et-nested-function/70125/6 "2016-06-26T08:54:54Z")

</div>

Je veux bien contourner le problème, mais je ne vois pas comment faire avec subprocess? On ne peut lancer que des commandes shell?

MErci

---

<div class="post-metadata">

**Author:** ![seb-ksl](https://www.debian-fr.org/user_avatar/www.debian-fr.org/seb-ksl/32/2946_2.png) [@seb-ksl](https://www.debian-fr.org/u/seb-ksl)\
**Post date:** [Juin 26, 2016, 2:41 UTC](https://www.debian-fr.org/t/python-exec-et-nested-function/70125/7 "2016-06-26T14:41:10Z")

</div>

> [@Almtesh](#):
>
> Tout simplement car il ne s’agit pas d’executer un sous-processus, mais de manipuler les variables.

Je crois que je viens juste de comprendre, tellement le code est bizarre.

@totola, tu confirmes : tu as une série de variables `retour1`-`retour19` qui contiennent des cases à cocher Tkinter, et tu cherches à ce que le statut 1 (coché) de `retour19` coche les 18 autres, c’est ça ?

> [@Almtesh](#):
>
> Je suis d’accord, ce n’est pas la meilleure façon de faire, mais là, le but est de faire fonctionner le truc si on le faire fonctionner autrement, on pourrait utiliser une liste ou un dictionnaire au lieu d’une série de variables, mais ce n’est pas du tout la question.

Là les avis divergent. Parce que si ce que j’ai compris du problème de @totola est vrai, c’est une erreur de design qui (pour moi) prévaut complètement sur le problème d’`exec` qu’il rencontre. La première solution à envisager est effectivement une liste de variables, plutôt qu’une affreuse bidouille à base d’`exec`.

Pour info, @totola, ça te donnerait quelque chose comme ça :

```python
retour = []
retour.append(ta_case_Tkinter_numero1)
[...]
retour.append(ta_case_Tkinter_numero19)
[...]

def ToutSelection():
    if retour[18].get() == 1:
        for i in range(18):
            retour[i].set(1)

```

Note que tes cases à cocher seront alors 0-indexées et non plus 1-indexées (ce qui est plus «&nbsp;propre&nbsp;»).

---

<div class="post-metadata">

**Author:** ![totola](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/3be4f8/32.png) [@totola](https://www.debian-fr.org/u/totola)\
**Post date:** [Juin 26, 2016, 2:44 UTC](https://www.debian-fr.org/t/python-exec-et-nested-function/70125/8 "2016-06-26T14:44:10Z")

</div>

Oui seb-ksl…  
En plus tu m’avais déjà corrigé quelque chose comme ça il y a un certain temps…  
😇

---

<div class="post-metadata">

**Author:** ![totola](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/3be4f8/32.png) [@totola](https://www.debian-fr.org/u/totola)\
**Post date:** [Juin 26, 2016, 2:45 UTC](https://www.debian-fr.org/t/python-exec-et-nested-function/70125/9 "2016-06-26T14:45:11Z")

</div>

J’essaie de bien intégrer ça cette fois et je reviens s’il y a un problème!  
Merci

---

<div class="post-metadata">

**Author:** ![totola](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/3be4f8/32.png) [@totola](https://www.debian-fr.org/u/totola)\
**Post date:** [Juin 26, 2016, 3:38 UTC](https://www.debian-fr.org/t/python-exec-et-nested-function/70125/10 "2016-06-26T15:38:51Z")

</div>

Yes, je crois que j’ai bien compris cette fois

Pour te le prouver j’ai aussi du reprendre mes canvas… 😉

```
self.canvas_image_fond=[None]
i=1
while(i<19):
       self.canvas_image_fond.append(Tkinter.Canvas(width = width_fond, height = height_fond, bg='white',bd=0,highlightthickness=0))
       self.canvas_image_fond[i].place(x=x_fond[i], y=y_fond[i], anchor='nw')
       i=i+1

```

Je te laisse deviner ce que j’avais fait avant… 😁

Bon par contre tu dis que c’est plus propre d’indexer de 0 à 18, j’ai pas respecté pour l’instant je préfère garder mes numéros de 1 à 19

Merci beaucoup en tout cas

---

<div class="post-metadata">

**Author:** ![totola](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/3be4f8/32.png) [@totola](https://www.debian-fr.org/u/totola)\
**Post date:** [Juin 27, 2016, 11:23 UTC](https://www.debian-fr.org/t/python-exec-et-nested-function/70125/12 "2016-06-27T11:23:12Z")

</div>

Hum j’ai un autre problème, j’ouvre un nouveau fil 🙂
