print qui ne s'affiche pas

a marqué ce sujet comme résolu.

Bonjour tout le monde,

J’essaie de comprendre pourquoi certains de mes print ne s’affichent pas. Regardez donc le code suivant :

1
2
3
4
5
6
7
8
for pattern in patterns:
    anagrams = solve_anagram(pattern)
    print anagrams  # debug

    for anagram in anagrams:
        for word in anagram:
            print word,
        print ''

La sortie attendue est :

1
2
3
4
[[u'ubiquit\xe9', u'fortuite']]
ubiquité fortuite
[[u'aupr\xe8s', u'd', u'un', u'halo', u'bleu']]
auprès d un halo bleu

Cependant, la sortie change à chaque fois que je lance le script, une sortie "type" ressemble à ceci:

1
2
3
[[u'ubiquit\xe9', u'fortuite']]
u'bleu']]
auprès d un halo bleu 

Et je n’ai aucune idée de pourquoi. Pire encore, si je retire la ligne de debug (print anagram), alors plus rien ne s’affiche. o_O Je sais qu’un print qui se finit par une virgule rentre dans une pile, qui n’est affichée que quand un rajoute un \n dans la pile. Mais là, le print '' est censé apporter ce retour à la ligne (et ça ne marche pas non plus avec un print "\n").

Ma question est donc la suivante. Pourquoi certaines parties ne sont pas affichées ? Accessoirement, pourquoi la sortie change à chaque exécution ?

(Je sais que je peux simplement afficher l’anagramme avec ' '.join(anagram), mais je veux comprendre ce qui se passe dans le cas présent.)

Edit : Il m’a suffi de créer ce topic pour que mon code se mette à fonctionner. O_o Dois-je exorciser mon ordinateur ?

+0 -0

Salut,

Les parenthèses ne sont pas le problème : elles l’auraient été si il avait été sous Python 3 mais vu qu’il n’obtient pas de SyntaxError, on sait qu’il tourne sous Python 2.

Je n’arrive pas à reproduire le problème :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Python 2.7.13 (default, Jan 12 2017, 17:59:37) 
[GCC 6.3.1 20161221 (Red Hat 6.3.1-1)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> anagrams = [[u'ubiquit\xe9', u'fortuite']]
>>> for anagram in anagrams:
...     for word in anagram:
...         print word,
...     print ''
... 
ubiquité fortuite 

Oui, je suis bien sous Python 2, désolé de ne pas avoir précisé. :)

tleb, j’ai testé ton code dans deux consoles différentes, et j’ai eu deux résultats différents.

  • En lançant une session python (ou ipython) depuis une console Anaconda, effectivement pas de bug ;
  • En lançant le code depuis Sublime Text 3, rien ne s’affiche.

Les deux consoles utilisent le même interpréteur (C:\Users\melepe\Anaconda2\python.exe), ce qui ne fait qu’augmenter ma surprise.

En trifouillant un peu, je me suis aperçu que dans Sublime, le code suivant :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
def solve_anagram(pattern):
    if pattern == 0:
        return [[u'ubiquit\xe9', u'fortuite']]
    else:
        return [[u'aupr\xe8s', u'd', u'un', u'halo', u'bleu']]


for pattern in range(2):
    anagrams = solve_anagram(pattern)
    for anagram in anagrams:
        for word in anagram:
            print word,
        print ''

n’affichait rien (enfin, parfois, en insistant un peu, [Decode error - output not utf-8] de façon inexpliquée), tandis que si j’inverse les deux return de solve_anagram, alors tout est bien affiché correctement (même si une fois ou deux il manquait ubiquité sur la deuxième ligne). Toujours est-il que c’est vraiment chelou.

En résumé, c’est vraiment un bug de Sublime Text, je ne sais pas si quelqu’un a une idée ? J’utilise le dernier build (3126).

unidan : Si c’est Sublime qui a tort, ça compte ? :p

+0 -0

Ton code est parfaitement correct, ça ressemble plutôt à une instance particulière des problèmes habituels d’encodage sous Windows. Si tu rajoutes un # -*- coding: utf-8 -*- (et que tu t’assures que ton fichier est bien enregistré avec le bon encodage, ce qui te permettrait de tomber les \xXX au passage), est-ce que c’est mieux ?

adr1 : Merci, je regarde ça quand je rentre chez moi. Mais ce qui me surprend le plus c’est le non déterminisme de la chose, notamment quand il m’affiche des résultats différents à chaque exécution…

Matouche : héhé ^^ Je dois dire que le dernier alexandrin m’a donné pas mal de fil à retordre !

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte