9
votes

Pourquoi la cordon de Python ne peut-il pas-être. \ X00 "de Python?

Je voulais rembourrer une chaîne avec des caractères nuls ("\ x00"). Je sais beaucoup de façons de le faire, alors veuillez ne pas répondre avec des alternatives. Ce que je veux savoir, c'est que: pourquoi fonctionne string.format () code> ne permet pas la fonction de remplissage avec des nulls?

cas de test: p> xxx pré>

Cela montre que des caractères échappés hexagonaux fonctionnent en général. P> xxx pré>

mais "\ x00" est transformé en espace ("\ x20"). P>

>>> spaces = "{0: <10}".format("bbb")
>>> nulls  = "{0:\x00<10}".format("bbb")
>>> spaces == nulls
True


2 commentaires

S'il vous plaît laissez un commentaire lorsque vous avez bowvote afin que je puisse améliorer cette question. J'ai fait mes recherches et connaissez sur LJUST et d'autres moyens d'accomplir la tâche. Je veux savoir pourquoi Python 2.7 se comporte de cette façon.


Utilisez Imprimer "BBB" + "\ x00" * 7 et vous obtiendrez une chaîne avec 7 espaces. Shell Imprimez toujours "\ x00" comme caractère d'espace. Sans tirage d'impression renvoie la version REC de la chaîne.


3 Réponses :


0
votes

Parce que la méthode string.format in python2.7 est un port arrière de Python3 string.format . Python2.7 Unicode est la chaîne Python 3, où la chaîne Python2.7 est les octets Python3. Une chaîne est le mauvais type pour exprimer des données binaires dans Python3. Vous utiliseriez des octets qui n'ont pas de méthode de format. Donc, vous devriez vraiment demander pourquoi est le format de la méthode sur la chaîne du tout en 2.7 lorsqu'il aurait dû vraiment seulement été sur le type Unicode, car c'est ce qui est devenu la chaîne de Python3.

Que je suppose que la réponse est que c'est trop pratique pour l'avoir là.

Comme une question connexe, pourquoi il n'y a pas Format SUR BYTES Pourtant < / p>


2 commentaires

Cela donne le même résultat: u "{0: \ x00 <10}". Format (U "BBB") . Le code source indique que les types d'unicode et de chaîne utilisent le même formateur.


@bonsaivier Oui, le point est que .format n'est pas pour les données binaires et ne doit pas être utilisé pour des données binaires. Essayer d'utiliser la méthode Unicode pour les données binaires ne va pas bien fonctionner.



4
votes

creuser dans le code source de Python 2.7, j'ai constaté que le problème est dans cette section à partir de ./ Objets / StringLib / Formatter.h code>, lignes 718-722 (dans la version 2.7.3) :

>>> "{0:<10}".format("foo")
'foo       '


0 commentaires

2
votes

La réponse à la question initiale est que c'était un bogue dans Python.

Il a été documenté comme autorisé, mais n'était pas. Il a été corrigé en 2014. Pour Python 2, le correctif est apparu pour la première fois en 2.7.7 ou 2.7.8 (je ne suis pas sûr de savoir comment)

original suivi problème .


0 commentaires