115 votes

Python 3 - Encodage/décodage vs Bytes/Str

Je suis nouveau dans python3, venant de python2, et je suis un peu perdu avec les principes fondamentaux de l'unicode. J'ai lu quelques bons articles, qui ont rendu tout cela beaucoup plus clair, mais je vois qu'il y a 2 méthodes sur python 3, qui gèrent l'encodage et le décodage, et je ne suis pas sûr de celle à utiliser.

L'idée de Python 3 est donc que chaque chaîne est unicode, et peut être encodée et stockée dans des octets, ou décodée pour redevenir une chaîne unicode.

Mais il y a deux façons de le faire :
u'something'.encode('utf-8') générera b'something' mais aussi bytes(u'something', 'utf-8') .
Et b'bytes'.decode('utf-8') semble faire la même chose que str(b'bytes', 'utf-8') .

Ma question est la suivante : pourquoi y a-t-il deux méthodes qui semblent faire la même chose ? L'une est-elle meilleure que l'autre (et pourquoi ?) J'ai essayé de trouver la réponse à cette question sur Google, mais sans succès.

>>> original = '27'
>>> type(original)
<class 'str'>
>>> encoded = original.encode('utf-8')
>>> print(encoded)
b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81'
>>> type(encoded)
<class 'bytes'>
>>> encoded2 = bytes(original, 'utf-8')
>>> print(encoded2)
b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81'
>>> type(encoded2)
<class 'bytes'>
>>> print(encoded+encoded2)
b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x8127\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81'
>>> decoded = encoded.decode('utf-8')
>>> print(decoded)
27
>>> decoded2 = str(encoded2, 'utf-8')
>>> print(decoded2)
27
>>> type(decoded)
<class 'str'>
>>> type(decoded2)
<class 'str'>
>>> print(str(b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81', 'utf-8'))
27
>>> print(b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81'.decode('utf-8'))
27

72voto

Lennart Regebro Points 52510

Aucune n'est meilleure que l'autre, elles font exactement la même chose. Cependant, l'utilisation .encode() y .decode() est la façon la plus courante de procéder. Elle est également compatible avec Python 2.

18voto

pepr Points 4263

À ajouter à La réponse de Lennart Regebro Il existe même une troisième voie qui peut être utilisée :

encoded3 = str.encode(original, 'utf-8')
print(encoded3)

Quoi qu'il en soit, c'est en fait exactement la même chose que la première approche. On peut également penser que la deuxième approche est un sucre syntaxique pour la troisième approche.


Un langage de programmation est un moyen d'exprimer formellement des idées abstraites, qui seront exécutées par la machine. Un langage de programmation est considéré comme bon s'il contient les constructions dont on a besoin. Python est un langage hybride, c'est-à-dire plus naturel et plus polyvalent que les langages purement OO ou purement procéduraux. Parfois, les fonctions sont plus appropriées que les méthodes objet, parfois c'est l'inverse. Cela dépend de l'image mentale du problème résolu.

Quoi qu'il en soit, la fonctionnalité mentionnée dans la question est probablement un sous-produit de l'implémentation/la conception du langage. À mon avis, il s'agit d'un bel exemple qui montre les différentes façons de penser à propos d'une même chose sur le plan technique.

En d'autres termes, appeler une méthode objet signifie penser en termes de "que l'objet me donne le résultat voulu" . L'appel d'une fonction comme alternative signifie "laisser le code extérieur traiter l'argument passé et extraire la valeur désirée". .

La première approche met l'accent sur la capacité de l'objet à effectuer la tâche par lui-même, la seconde approche met l'accent sur la capacité d'un algorithme séparé à extraire les données. Parfois, le code séparé peut être tellement spécial qu'il n'est pas judicieux de l'ajouter comme méthode générale à la classe de l'objet.

12voto

Colin Enstone Points 111

Pour ajouter à la réponse précédente, il y a même une quatrième voie qui peut être utilisée

import codecs
encoded4 = codecs.encode(original, 'utf-8')
print(encoded4)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X