1
votes

Comment ajouter des préfixes de chaîne aux variables en python?


18 commentaires

«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," ...


3 Réponses :


2
votes

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.


10 commentaires

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 ') ) 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



0
votes

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


0 commentaires

1
votes

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 .

Aussi juste pour référence, la grammaire les appelle stringprefix , et juste" prefix "dans le texte.


0 commentaires