Changer l'encoding par défaut de python

Le problème exposé dans ce sujet a été résolu.

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 !

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.

+0 -0

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.

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).

@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.

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