Bonjooour les zamis [ bienvenue au pays trop mignon ]
Au cours de mes pérégrination pythranesques, j'ai découvert une fleur du langage python, que je m'empresse de partager.
D'après vous, qu'affiche la séquence suivante ?
def foo(a=list()): return a
foo().append(1)
foo().append(2)
print foo()
Et hop une manière détournée (et hideuse, elle n'a donc pas à sa place au pays trop mignon) d'avoir des variables statiques dans une fonction en python.

# C'est très connu
Posté par GuieA_7 (page perso) . Évalué à 5.
Ça doit même être dans le tutoriel de Guido Van Rossum (je regarderai). C'est pourquoi il est conseillé de toujours utiliser des objets "immutable" en tant que valeur par défaut. Quand je forme des débutants, je présente ça comme un écueil classique.
[^] # Re: C'est très connu
Posté par serge_sans_paille (page perso) . Évalué à 4.
En tout cas c'est dans le tutoriel officiel.
Comme quoi l'apprentissage par induction dont je suis friand a ses limites :-).
[^] # Re: C'est très connu
Posté par Jean B . Évalué à 3.
s/immutable/immuable/
[^] # Re: C'est très connu
Posté par GuieA_7 (page perso) . Évalué à 2.
s/immuable/immuables/ :)
J'ai fait mon Jean-Claude Van Damme, mais j'ai préféré utiliser le terme anglais pour éviter les confusions (d'où les guillemets et le non accord).
# J'aime pas ce comportement
Posté par alberthier (page perso) . Évalué à 5.
la liste a devient un objet attaché à l'objet fonction 'foo' qui est réutilisé à chaque appel
C'est vicieux car on a l'impression de donner une valeur par défaut et ce n'est pas le cas.
http://www.artfulcode.net/articles/mutable-default-parameter-values-python/
Du coup pour les valeurs par défaut, il est préconisé de mettre None et de traiter le cas das la fonction:
deviendrait
[^] # Re: J'aime pas ce comportement
Posté par serge_sans_paille (page perso) . Évalué à 0.
Oui, j'ai vu cet idiome de nombreuses fois. Ça ressemble furieusement à ça http://en.wikipedia.org/wiki/Option_type.
[^] # Re: J'aime pas ce comportement
Posté par Jux (page perso) . Évalué à 2.
L'implémentation des Options en Scala est sympa. C'est très utile comme idiome car ça aide à éviter des segfault/NullPointerException/None qu'on a trop souvent dans les autres langages.
[^] # Re: J'aime pas ce comportement
Posté par Axioplase ıɥs∀ (page perso) . Évalué à 4.
Pas du tout.
Un type option permet de distinguer "None" de "Just None" (ou de "Some None"), alors que là, c'est impossible.
[^] # Re: J'aime pas ce comportement
Posté par GaMa . Évalué à 1.
Pour les options j'utiliserais plutôt un truc de ce style:
[^] # Re: J'aime pas ce comportement
Posté par Jux (page perso) . Évalué à 6.
En fait si on réfléchis aux instructions "def" non pas comme des définitions de fonctions mais comme des créations de singleton avec un opérateur (), on arrive à se mettre ce comportement dans la tête.
Cela dit, c'est vraiment contre-intuitif. Au point que je me demande s'il n'aurait pas été plus malin d'interdire (ou de mettre un warning lorsque la valeur par défaut est mutable) cela.
C'est certes parfois utilisé pour maintenir un état dans une fonction, mais c'est plus un hack qu'autre chose et ça contredit le moto "Explicit is better than implicit.".
Quelqu'un sait si la pertinence de ce comportement a été officiellement discutée ?
[^] # Re: J'aime pas ce comportement
Posté par HardShooter . Évalué à 1.
Le problème c'est qu'on ne peut pas vraiment savoir quel objet est mutable ou pas, puisque tu peux rajouter des méthodes après que des objets soit créés par exemple, ça pousserai aussi a faire une analyse du type de l'objet au moment de l'exécution du def, ce qui assez complexe dans le cas de python (et je ne parle pas des objets implémentés en C), ensuite comme les attributs sont modifiables par tout le monde, tu est obligé de faire une analyse statique sur tout ton programme.
En résumé pas possible :)
# la valeur par défaut n'est évaluée qu'une fois
Posté par glickind . Évalué à 5.
la valeur par défaut n'est évaluée qu'une fois, qu'elle soit mutable ou non …
[^] # Re: la valeur par défaut n'est évaluée qu'une fois
Posté par GaMa . Évalué à 5.
C'est même extrêmement important à comprendre au sujet des lambda :
Et en beaucoup plus vicieux :
[^] # Re: la valeur par défaut n'est évaluée qu'une fois
Posté par GaMa . Évalué à 4.
J'ai dit lambda mais c'est exactement la même chose avec les fonction
# Quelle version de python ?
Posté par Zarmakuizz (page perso) . Évalué à -1.
Chez moi le code ne marche pas.
En utilisant Python 2.7 et pas de version 3.x :
Commentaire sous licence LPRAB - http://sam.zoy.org/lprab/
[^] # Re: Quelle version de python ?
Posté par ʇpooɹquooɥɔs sɐȷoɔᴉu . Évalué à 6.
quand tu utilises l'interpréteur, tu dois mettre une ligne vide après la définition de la fonction :
Tous les nombres premiers sont impairs, sauf un. Tous les nombres premiers sont impairs, sauf deux.
[^] # Re: Quelle version de python ?
Posté par Zarmakuizz (page perso) . Évalué à 2.
Mea culpa, ça faisait longtemps que je n'ai pas utilisé l'interpréteur.
Commentaire sous licence LPRAB - http://sam.zoy.org/lprab/
# coloration syntaxique
Posté par eastwind☯ . Évalué à 2. Dernière modification : le 31/07/12 à 12:18
Je découvre qu'on peut faire la coloration syntaxique pour bash sous dlfp, merci :)
test:
[^] # Re: coloration syntaxique
Posté par Xavier Claude (page perso) . Évalué à 3.
Tu vis sous l'eau? La coloration était là depuis le début de la version ROR.
« Moi, lorsque je n’ai rien à dire, je veux qu’on le sache. » Raymond Devos
[^] # Re: coloration syntaxique
Posté par eastwind☯ . Évalué à 2.
Je savais pour le ruby, j'ignorais pour les autres langages. Au fait lesquels supporte t-il encore ?
[^] # Re: coloration syntaxique
Posté par Xavier Claude (page perso) . Évalué à 3.
Je ne sais plus quelle est la bibliothèque utilisée (j'ai http://pygments.org/ en tête, mais comme c'est en python, j'ai un doute). Mais ça couvre beaucoup de langages, de mémoire, C, C++, Java, Go, Python, Ruby, sh sont couvert et le seul pour lequel j'ai eu un problème, c'est Rust qui n'est pas encore prix en charge.
« Moi, lorsque je n’ai rien à dire, je veux qu’on le sache. » Raymond Devos
[^] # Re: coloration syntaxique
Posté par gnuzer (page perso) . Évalué à 10.
C'est sûrement parce que ça ne vaut pas le coût.
# Autres syntaxes
Posté par Victor STINNER (page perso) . Évalué à 7.
Au cours de mes pérégrination pythranesques, j'ai découvert une fleur du langage python, que je m'empresse de partager.
Ce n'est pas vraiment une "fonctionnalitée" cachée. Il y a d'autres manières d'avoir des variables locales pour une fonction.
Exemple avec une fermeture (closure) :
À partir de Python 3, on peut également modifier la variable (et non pas juste son contenu) grâce à nonlocal :
On peut également utiliser des attributs arbitraires à la fonction pour y stocker des trucs :
(La fonction peut également modifier hello.world)
Envoyer un commentaire
Suivre le flux des commentaires
Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.