Le terme "préfixe de chaîne" est expliqué ici a>.
Que faire si vous avez une chaîne qui a déjà été affectée à une variable, comment ajouter le préfixe de chaîne à cela (sans utiliser la même chaîne)? Cela peut être attribué à une nouvelle variable ou réaffecté à la même.
3 Réponses :
Vous ne pouvez pas ajouter ou supprimer rétroactivement un préfixe littéral de chaîne. Une fois fait, il ne s'agit que d'un str
(ou octets
avec un préfixe b
). Si vous avez besoin de convertir quelque chose qui était un littéral octets
en str
ou vice-versa, vous utilisez le bytes.decode
ou str .encode
respectivement, comme vous le feriez sur n'importe quel octets
ou str
, indépendamment du fait qu'il ait commencé comme un littéral ou non, car il n'y a pas de différence entre les littéraux et les chaînes non littérales immédiatement après l'évaluation du littéral.
Note pédante que je ne voulais pas dans la réponse elle-même: techniquement, les littéraux str
peuvent être internés là où les str
non littéraux le sont rarement, mais cela n'est pas pertinent à utiliser sauf vous n'utilisez pas correctement is
pour les comparaisons de chaînes.
Donc, si vous avez sg = 'stng', comment pouvez-vous obtenir sgl = u'stng 'depuis sg (sans utiliser' stng ')
@dsfgh: Si vous êtes sur Python 3, ils ont tous les deux la même chaîne. u
est un préfixe facultatif sans signification sur Python 3 pour aider au portage des scripts Python 2. Il dit simplement "cette chaîne peut contenir Unicode", mais sur Python 3, c'est ainsi que tous les str
sont déjà.
Ok un exemple avec un autre préfixe de chaîne alors.
@dsfgh: Avez-vous vu ma première phrase? Cela ne peut être fait dans le cas général. Vous pouvez modifier certains str
pour qu'ils ressemblent à des littéraux octets
( 'stng'.encode (' latin-1 ') code >) mais cela suppose qu'ils contiennent uniquement des caractères latin-1; s'ils contiennent des caractères non-latin-1, il n'y a pas d'octet équivalent unique. Les littéraux sont des littéraux ; le littéral lui-même possède ou n'a pas de préfixe, vous ne pouvez pas le modifier rétroactivement.
si des erreurs se produisent, il peut y avoir une notification indiquant que cela ne peut pas être fait. Je pense que la réponse serait une fonction où le préfixe peut être sélectionné.
Mais oui, dire qu'il n'y a pas de moyen général est une réponse utile à souligner également.
@dsfgh: Essayer d'écrire une telle fonction de sélection de préfixe est difficile au point où, étant donné l'utilité limitée d'une telle fonction et l'incapacité de couvrir tous les cas, les "avantages" ne valent pas la peine d'écrire. L'idée dans son ensemble est absurde au départ, puisque, comme je l'ai dit, les préfixes n'ont de sens qu'en termes de littéraux; des choses comme les préfixes r
et f
sont littéralement impossibles à greffer après coup avec autre chose que l'heuristique la plus lâche, et b
est presque aussi mauvais.
@dsfgh: Vous essayez de déchiffrer un œuf brouillé et de le faire bouillir à la place.
@ user2357112 prend en charge Monica, ce qui donne l'impression que c'est difficile à faire
Selon Python 2 manuel
Littéraux Unicode dans le code source Python
Dans le code source Python, les littéraux Unicode sont écrits sous forme de chaînes précédé du caractère «u» ou «U»: u'abcdefghijk ». Code spécifique les points peuvent être écrits en utilisant la séquence d'échappement \ u, qui est suivie par quatre chiffres hexadécimaux donnant le point de code. La séquence d'échappement \ U est similaire, mais attend 8 chiffres hexadécimaux, pas 4.
Mais en Python 3
Le type de chaîne < / strong>
Depuis Python 3.0, le type str du langage contient des caractères Unicode, signifiant toute chaîne créée en utilisant "unicode rocks!", 'unicode rocks!', ou la syntaxe de chaîne entre guillemets triples est stockée sous Unicode.
L'encodage par défaut du code source Python est UTF-8, vous pouvez donc inclure simplement un caractère Unicode dans une chaîne littérale:
En ce qui concerne les variables déjà créées, soit par saisie utilisateur, soit en lisant un fichier ou autre, vous devez lire sur chaque méthode comment manipuler les unicodes
En général, vous ne pouvez pas. Les préfixes de chaîne font partie de la syntaxe, pas des données. En d'autres termes, ils ne créent pas un type de chaîne différent, mais créent une chaîne d'une manière différente .
u
ne fait rien en Python 3. Il n'existe que pour la compatibilité avec Python 2 a>.
f
peut être émulé avec str.format ()
pour les cas simples , mais pour émuler complètement une chaîne f, vous devez l'évaluer, mais c'est un risque de sécurité car les f-strings peuvent contenir du code arbitraire .
r
peut être émulé avec str.encode ('unicode_escape'). decode ()
dans certains cas , mais pas tous, par exemple, cette chaîne littérale est avec perte:
>>> b'a\x89\u2013' b'a\x89\\u2013' >>> 'a\x89\u2013' 'a\x89â' >>> 'a\x89\u2013'.encode('raw_unicode_escape') b'a\x89\\u2013' >>> 'a\x89\u2013'.encode('raw_unicode_escape').decode('raw_unicode_escape') 'a\x89â'
b
est une exception en ce qu'il crée en fait un type différent: un objet bytes
. Il peut être émulé avec le codage raw_unicode_escape , bien que je ne le fasse pas Je n'ai aucune expérience de son utilisation, donc je ne sais pas si c'est la même chose:
>>> r'\x61' '\\x61' >>> s = '\x61' >>> s 'a' >>> s.encode('unicode_escape').decode() 'a'
Aussi juste pour référence, la grammaire les appelle stringprefix
, et juste" prefix "dans le texte.
«Déclarations d'encodage de chaîne» n'est pas un terme réel, et ce serait un terme terrible s'il l'était, car il n'a rien à voir avec l'encodage. Certains rando viennent de modifier leur propre terminologie inventée dans cette réponse.
@ user2357112 prend en charge Monica Alors comment s'appelle-t-il?
Je ne pense pas qu'il y ait un nom.
@ user2357112 prend en charge Monica Les gens créent de nouveaux termes tout le temps, la façon dont la langue fonctionne est si vous comprenez ce qu'ils disent. Comprenez-vous de quoi ils parlent?
S'il n'apparaissait pas littéralement dans la phrase "" Les lettres avant les chaînes sont appelées ici "déclarations d'encodage de chaînes". ", Je ne saurais pas de quoi elles parlaient. J'aurais deviné que c'était un terme trompeur pour un commentaire d'encodage PEP 263 , ce qui est une chose complètement différente. Il n'y a qu'un seul hit google pour
python "string encoding declaration"
utilisant le "term" de cette manière, et c'est par le gars qui a fait la modification.@ user2357112 prend en charge Monica Je pense que c'est quelque chose qui a besoin d'un nom, est-ce que 'prefix' ou 'string prefix' fonctionne au moins?
Vous ne pouvez pas cingler des utilisateurs arbitraires comme ça sur Stack Overflow. jdi n'a pas reçu votre tentative de ping. jdi n'est de toute façon pas la personne qui a inséré ce terme dans la réponse - modifier l'historique montre que c'était ce type , et à en juger par sa réponse ici , ils ont mal lu la documentation pour encoder les commentaires.
@ user2357112 prend en charge Monica Je n'ai pas le représentant pour commenter ici. Cependant, jdi n'a-t-il pas accepté la modification? Alors préfixe? Depuis que ce terme a été utilisé avant?
jdi est à peine actif depuis des années et n'a eu aucune activité pendant une période de plus d'un mois entourant la modification. Ils ne faisaient probablement pas attention.
@ user2357112 prend en charge Monica ok merci d'avoir examiné cela. J'ai changé le libellé, mais peut être changé à nouveau si cela est encore déroutant.
Je pense que c'est un débat sur la terminologie. Je le suggérerais maintenant.
@Stathis Alexopoulos Je ne suis pas en train de débattre, j'accepterai quoi que ce soit, si cela doit être écrit en explication à chaque fois, d'accord, mais je pense que les termes sont préférables.
Qu'est-ce que cela a à voir avec Python 3? Le préfixe
u
n'existe que pour accueillir le code hérité maintenant , et il ne fait rien . Demandez-vous des préfixes différents? Ils fonctionnent tous différemment. Voir Transformer une chaîne en chaîne F , Convertir une chaîne Python ordinaire en chaîne brute , Convertir une chaîne en octet@wjandrea donc pour la réponse, il faudrait créer une fonction pour tous les cas, en fonction de la lettre sélectionnée, c'est ce que cela ressemble.
@dsfgh Une fonction? Je suppose que vous pourriez en écrire un, mais je ne le ferais pas. Les différents préfixes sont des choses fondamentalement différentes. Par exemple, les chaînes f ne correspondent pas 1 à 1 avec
str.format
car elles peuvent contenir des expressions et ces expressions ne sont pas limitées, donc les évaluer naïvement serait un risque pour la sécurité . Je vais voir si je peux vous écrire une réponse pour expliquer les autres.@wjandrea cool peut-être que je créerai la fonction moi-même, toutes les informations utiles seront utiles.
@dsfgh Pas pour faire éclater votre bulle, mais la seule raison d'écrire cette fonction serait un exercice d'apprentissage. Si vous avez besoin d'une fonction qui fait cela, vous faites probablement quelque chose de mal.
BTW a oublié de mentionner, bienvenue à SO! Consultez la visite et la Comment faire Demandez si vous voulez des conseils. De plus, l'une de vos modifications a coupé une phrase en deux: "Selon la façon dont le terme est utilisé ici," ...