Changer l'encoding par défaut de python

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous,

Dans le cadre du développement de la ZEP-23, consacré à l'API des MPs, un bug a été rencontré concernant une sombre histoire d'encoding. En détaillant la stacktrace, il semblait que l'erreur restait dans la librairie que nous utilisons pour l'API, à savoir Django Rest Framework. J'ai donc posté une issue qui explique le problème rencontré (vous pourrez y voir les détails techniques et la stacktrace dessus).

Il en résulte que le problème ne vient pas de chez eux mais de ma configuration de l'encoding de mon python. Il était en ascii et je devais la mettre en UTF-8. J'ai donc créé un fichier sitecustomize.py dans ~/.virtualenv/lib/python/ pour spécifier l'encoding par défaut :

1
2
3
import sys
reload(sys)
sys.setdefaultencoding("utf-8")

Ceci règle le problème mais cette manipulation ne semble pas anodine et j'aimerais en connaitre la réelle signification et les impacts qu'elle pourrait avoir.

Je suis donc à l'écoute de toutes les informations concernant cette manipulation dans le cadre du projet Django de Zeste de Savoir.

Merci d'avance !

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

Je pense que c'est simplement dû au fait que tu travailles avec Python 2.

Typiquement, ça ne se produira plus lors de la prochaine release de ZdS puisque Python 3 bosse avec des chaînes de caractères exclusivement unicode, et qu'il utilise pour cela utf-8 comme encodage par défaut.

Concernant l'impact de la manip en question, il est négligeable : tout ce qui était en ASCII jusqu'à présent va rester en ASCII (utf-8 est un surensemble strict d'ASCII). C'est juste que chaque fois qu'une chaîne Unicode devra être décodée ou encodée, elle le sera en utilisant utf-8 par défaut.

Par contre, tu es sûr que le reload du module sys doit avoir lieu avant de modifier l'encodage par défaut ? Ça me semble louche, mais d'un autre côté ça fait un bail que je n'ai pas touché à Python 2.

Édité par nohar

I was a llama before it was cool

+0 -0
Auteur du sujet

Typiquement, ça ne se produira plus lors de la prochaine release de ZdS puisque Python 3 bosse en unicode avec utf-8 comme encodage par défaut.

Malheureusement, Python 3 n'est pas prévu pour la prochaine release de ZdS pour des raisons serveurs. Il faudra attendra sa migration vers un nouveau pour pouvoir merger la compatibilité Python 3. Je dois donc trouvé une solution alternative en attendant ce merge.

Concernant l'impact de la manip en question, je pense qu'il est négligeable : tout ce qui était en ASCII jusqu'à présent va rester en ASCII (utf-8 est un surensemble strict d'ASCII).

C'est déjà une bonne nouvelle. D'après les vagues tests que j'ai fais, ça ne change rien à l'usage non plus en local.

Par contre, tu es sûr que le reload du module sys doit avoir lieu avant de modifier l'encodage par défaut ?

D'après les ressources sur Internet que j'ai trouvé (ici et par exemple), oui.

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

Pour le reload, l'explication est que normalement la fonction setdefaultencoding n'est dispo qu'a l'init (pendant le chargement de sitecustomize.py) et elle est viré du module sys juste après. Le reload n'est nécessaire que si cette fonction doit être appelé dans un autre script que sitecustomize.py donc (car python ne recharge pas les modules normalement donc si le sys a été chargé et modifié par le script d'init, c'est le version modifié que tu va recevoir lors d'un import, sauf si on force le rechargement).

+0 -0
Auteur du sujet

@Kje : Donc, dans mon cas présent, le reload n'était pas nécessaire puisque j'ai modifié sitecustomize.py. Merci pour l'info.

Sinon merci pour les réponses. Ca nous a conforté dans le choix que c'était une bonne solution. Cette manipulation sera intégrée dans la prochaine release.

+0 -0
Staff

Dans le cas de zds il pourrait etre intéressant de le rajouter directement dans le code de l'appli (et donc éviter des manipulation d'installation a l'utilisateur) mais dans ce cas le reload est obligatoire.

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

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