comment convertir Python 2 unicode() fonction en Python 3.x syntaxe
J'ai activé la vérification de la compatibilité dans mon IDE Python et maintenant je me rends compte que les hérité de Python 2.7 code a beaucoup d'appels à unicode()
qui ne sont pas autorisés dans Python 3.x.
J'ai regardé la docs de Python2 et n'a trouvé aucune indication comment mettre à niveau:
Je ne veux pas passer à Python3 maintenant, mais peut-être dans l'avenir.
Le code contient environ 500 appels à unicode()
Comment procéder?
Mise à jour
Le commentaire de l'utilisateur vaultah lire la pyporting guide a reçu plusieurs upvotes.
Ma solution actuelle est cela (merci à Pierre-Bretagne):
from builtins import str
... Je ne pouvais pas trouver cette astuce dans le pyporting docs.....
- docs.python.org/3/howto/pyporting.html
- ce n'est pas une question d'ordre général. Il n'est que d'environ
unicode()
appels. J'ai le code de base qui je travaille actuellement sur, il y a environ 700 appels à cette méthode. Que dois-je faire? - Il n'y a pas de bonne réponse à cette question. Si vous êtes chanceux, vous pouvez simplement supprimer les appels à
unicode
et vous êtes bon pour aller. Toutes les chaînes de caractères unicode en Python 3. Si cela ne fonctionne pas, alors attendez-vous à beaucoup de travail. La transition de str en unicode littéraux et des octets est de loin le plus incompatible changement lors de la commutation de Python de 2 à 3. - Ne pourriez-vous définir votre propre
unicode()
fonction qui ne fait rien maisreturn str(arg)
en Python 3? - vous pouvez affecter
str
àunicode
-unicode = str
(sans les parenthèses). Il devrait fonctionner. - réécrire ces appels ou de fournir votre propre
unicode
fonction de la remplacer. Vous aurez plus de problèmes avec la mise à niveau vers Python 3 cependant. - sauf que
unicode()
en Python 2 acceptestr
objets sans donner un codage explicite (décodage implicitement comme ASCII). En Python 3 en passant dans unbytes
objet de lever une exception. - Dans quel but utilisez-vous
unicode()
? Veuillez fournir un exemple de votre code lorsque vous utilisezunicode()
. - oui, je pourrais faire 500 fois vérifier pourquoi il est utilisé. Mais d'abord je veux avoir un no-brainer comme solution.
from builtins import str
est un no-brainer, et plus tard, quelqu'un pourrait regarder à chaque utilisation dans le détail. Mais ce sera une autre question. - Vous l'avez déjà utilisé 500 fois!? C'est exactement pourquoi je pose la question. La bonne réponse n'est utile que si elle aborde le problème réel. Il semble que vous êtes en utilisant
unicode()
de manière incorrecte et peut être fixé avec une solution simple qui est sûr pour vos données, coffre-fort pour plusieurs langues et dans l'avenir. Vous devriez lire Comment Demander et un minimum de reproductibles exemple et lâche l'attitude - Oui, le code contient 500 fois. Mais ... c'est pas "mon code". C'est le code de la pose devant moi aujourd'hui.
- qu'entendez-vous par "... et lâche l'attitude?"
- Je voulais dire "perdre". J'ai essayé de l'aider mais ma demande (et les autres) pour obtenir une vision complète du problème afin de vous aider à mieux été accueilli avec un curt et de dédain. Encore une fois, une explication complète du problème, y compris le fait que vous avez hérité de la base de code peut donner de meilleures réponses que juste de répondre à la solution de Y.
- oui, vous avez raison. Le code a été élaboré par une équipe de dix personnes. Je suis l'un d'entre eux. Ce n'est pas "mon" code. J'ai mis à jour la question.
- Réponse courte: Ajouter
unicode = str
avant tout unicode appels - est-ce vraiment une bonne idée? semble que vous essayez de coder en dur un peu dur.
- Oui, il est. Savez-vous à propos de la définition d'une fonction? Les fonctions sont comme des variables, et vous pouvez affecter cette fonction à une autre variable.
Vous devez vous connecter pour publier un commentaire.
Comme cela a déjà été souligné dans les commentaires, il y a déjà des conseils sur le portage de 2 à 3.
Ayant eu récemment à port une partie de mon code à partir de 2 à 3 et de maintenir la compatibilité de chaque pour l'instant, je recommande de tout cœur à l'aide de python-avenir, qui fournit un excellent outil pour aider à mettre à jour votre code (
futurize
) ainsi que des orientations claires pour comment écrire de la croix-compatible code.Dans votre cas particulier, je voudrais simplement convertir tous les appels en unicode à utiliser str et puis importation de str à partir d'objets internes. Toute IDE vaut son sel ces jours-ci permettra de faire la recherche globale et remplacer en une seule opération.
Bien sûr, c'est le genre de chose futurize doit attraper trop, si vous voulez juste utiliser la conversion automatique (et à rechercher d'autres problèmes potentiels dans votre code).
futurize
aidera à transformer le code de base;unicode()
appels seront transformés enstr()
appels avec unfrom builtins import str
importer en haut. Ne prendre en compte que, généralement, n'ajoutez une installation-type d'exigence pour l'future
bibliothèque Python 2 (afin d'assurer le rétroportagebuiltins
module).Vous pouvez tester si il ya une telle fonction comme
unicode()
dans la version de Python que vous êtes en cours d'exécution. Si non, vous pouvez créer ununicode()
alias pour lestr()
fonction, qui n'en Python 3 ceunicode()
n'en Python 2, comme toutes les chaînes unicode en Python 3.Noter qu'une information plus complète sur le port est probablement une meilleure idée; voir le guide de portage pour plus de détails.
Réponse courte: Remplacer tous les
unicode
appels avecstr
appels.Réponse longue: En Python 3, Unicode a été remplacé par des chaînes en raison de son abondance. La solution suivante devrait fonctionner si vous êtes seulement à l'aide de Python 3:
Si vous l'utilisez avec Python 2 et Python 3, utilisez ceci à la place:
L'autre sens: exécuter ce dans la ligne de commande
D'abord, en tant que stratégie, je prendrais une petite partie de votre programme et d'essayer de le porter. Le nombre de
unicode
les appels que vous décrivez me font croire que votre application se soucie de la chaîne des représentations plus que la plupart, et chaque cas d'utilisation est souvent différente.L'important est que toutes les chaînes unicode en Python 3. Si vous utilisez le
str
type de magasin "octets" (par exemple, si elles sont lues à partir d'un fichier), vous devez être conscient que ceux qui ne seront pas des octets dans Python3 mais sera caractères unicode pour commencer.Examinons quelques cas.
Tout d'abord, si vous ne possédez pas de caractères non-ASCII à tous et ne sont pas vraiment en utilisant le jeu de caractères Unicode, il est facile. Les Chances sont que vous pouvez simplement modifier la
unicode()
fonction destr()
. Qui va s'assurer que tout objet passé en argument est converti correctement. Cependant, il est illusoire de penser que c'est facile.Le plus probable, vous aurez besoin de regarder à l'argument de
unicode()
pour voir ce que c'est, et de déterminer comment la traiter.Par exemple, si vous êtes la lecture de caractères UTF-8 à partir d'un fichier en Python 2 et de leur conversion en Unicode votre code devrait ressembler à ceci:
Cependant, en Python3,
read()
renvoie les données Unicode pour commencer, et l'unicode décodage doit être spécifié lors de l'ouverture du fichier:Comme vous pouvez le voir, la transformation de
unicode()
simplement lors du portage peut dépendre fortement sur le comment et le pourquoi de la demande est à faire des conversions Unicode, où les données proviennent, et où il va.Python3 apporte plus de clarté aux représentations de chaîne, qui est le bienvenu, mais il peut faire le portage de taille. Par exemple, Python3 a une bonne
bytes
type, et de convertir des octets de données unicode comme ceci:ou à convertir le type de données à caractère formulaire à l'aide de l'inverse de la transformation.
J'espère au moins permet de déterminer une stratégie.
unicode()
correctement