web-dev-qa-db-fra.com

Pourquoi la comparaison des octets avec str échoue-t-elle en Python3

En Python3, cette expression est évaluée comme False:

b"" == ""

alors qu'en Python2 cette comparaison est True:

u"" == ""

La vérification de l'identité avec is échoue évidemment dans les deux cas.

Mais pourquoi implémenteraient-ils un tel comportement en Python3?

19
steffen

Dans Python 2.x, l'objectif de conception pour unicode est d'activer des opérations transparentes entre les chaînes unicode et octet en convertissant implicitement entre les 2 types. Lorsque vous effectuez la comparaison u"" == "", le unicode LHS est d'abord automatiquement codé dans une chaîne d'octets, puis comparé au str RHS. C'est pourquoi il a renvoyé True.

En revanche, Python 3.x, ayant appris du désordre d'unicode qui se trouvait dans Python 2, a décidé de tout rendre explicite sur les chaînes unicode vs octets explicites) . Donc, b"" == "" est False car la chaîne d'octets n'est plus automatiquement convertie en unicode pour comparaison.

16
oxymor0n

Dans python 3 est Unicode. Le type utilisé pour contenir le texte est str et le type utilisé pour contenir les données est bytes.

les types str et octets ne peuvent pas être mélangés, vous devez toujours convertir explicitement entre eux. Utilisez str.encode() pour passer de str à octets et bytes.decode() pour passer d'octets à str.

Par conséquent, si vous faites b"".decode() == "" vous obtiendrez True:

>>> b"".decode() == ""
True

Pour plus d'informations, lisez Texte vs données au lieu de Unicode vs 8-bi

15
Kasramvd

Les concepteurs ont décidé de ne pas supposer un codage pour la coercition lors de la comparaison des octets aux chaînes, il tombe donc sous le comportement par défaut de Python 3.x où les comparaisons contenant des types différents échouent.