141 votes

Que signifie le symbole "u" devant les valeurs d'une chaîne de caractères ?

Oui, en résumé, j'aimerais savoir pourquoi je vois un u devant mes clés et mes valeurs.

J'effectue le rendu d'un formulaire. Le formulaire comporte une case à cocher pour l'étiquette particulière et un champ de texte pour l'adresse IP. Je crée un dictionnaire dont les clés sont les étiquettes codées en dur dans list_key et les valeurs du dictionnaire proviennent de l'entrée du formulaire (list_value). Le dictionnaire est créé mais il est précédé de u pour certaines valeurs. Voici l'exemple de sortie du dictionnaire :

{u'1': {'broadcast': u'on', 'arp': '', 'webserver': '', 'ipaddr': u'', 'dns': ''}}

Quelqu'un peut-il m'expliquer ce que je fais de travers ? Je n'obtiens pas l'erreur lorsque je simule une méthode similaire dans pyscripter. Toute suggestion pour améliorer le code est la bienvenue. Je vous remercie de votre attention.

#!/usr/bin/env python

import webapp2
import itertools
import cgi

form ="""
    <form method="post">
    FIREWALL 
    <br><br>
    <select name="profiles">
        <option value="1">profile 1</option>
        <option value="2">profile 2</option>
        <option value="3">profile 3</option>
    </select>
    <br><br>
    Check the box to implement the particular policy
    <br><br>

    <label> Allow Broadcast
        <input type="checkbox" name="broadcast">
    </label>
    <br><br>

    <label> Allow ARP
        <input type="checkbox" name="arp">
    </label><br><br>

    <label> Allow Web traffic from external address to internal webserver
        <input type="checkbox" name="webserver">
    </label><br><br>

    <label> Allow DNS
        <input type="checkbox" name="dns">
    </label><br><br>

    <label> Block particular Internet Protocol  address
        <input type="text" name="ipaddr">
    </label><br><br>

    <input type="submit">   
    </form>
"""
dictionarymain={}

class MainHandler(webapp2.RequestHandler):  
    def get(self):
        self.response.out.write(form)

    def post(self):
        # get the parameters from the form 
        profile = self.request.get('profiles')

        broadcast = self.request.get('broadcast')
        arp = self.request.get('arp')
        webserver = self.request.get('webserver')
        dns =self.request.get('dns')
        ipaddr = self.request.get('ipaddr')

        # Create a dictionary for the above parameters
        list_value =[ broadcast , arp , webserver , dns, ipaddr ]
        list_key =['broadcast' , 'arp' , 'webserver' , 'dns' , 'ipaddr' ]

        #self.response.headers['Content-Type'] ='text/plain'
        #self.response.out.write(profile)

        # map two list to a dictionary using itertools
        adict = dict(zip(list_key,list_value))
        self.response.headers['Content-Type'] ='text/plain'
        self.response.out.write(adict)

        if profile not in dictionarymain:
            dictionarymain[profile]= {}
        dictionarymain[profile]= adict

        #self.response.headers['Content-Type'] ='text/plain'
        #self.response.out.write(dictionarymain)

        def escape_html(s):
            return cgi.escape(s, quote =True)

app = webapp2.WSGIApplication([('/', MainHandler)],
                              debug=True)

196voto

jdi Points 38029

Le "u" devant les valeurs de la chaîne signifie qu'il s'agit d'une chaîne Unicode. L'Unicode est un moyen de représenter plus de caractères que l'ASCII normal ne peut en gérer. Le fait que vous voyiez le u signifie que vous êtes sous Python 2 - les chaînes de caractères sont Unicode par défaut sous Python 3, mais sous Python 2, la balise u devant distingue les chaînes Unicode. Le reste de cette réponse se concentre sur Python 2.

Vous pouvez créer une chaîne Unicode de plusieurs façons :

>>> u'foo'
u'foo'
>>> unicode('foo') # Python 2 only
u'foo'

Mais la vraie raison est de représenter quelque chose comme ceci ( traduction ici ):

>>> val = u'Ознакомьтесь с документацией'
>>> val
u'\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439'
>>> print val
Ознакомьтесь с документацией

Dans l'ensemble, les chaînes de caractères Unicode et non-Unicode sont interopérables avec Python 2.

Vous verrez d'autres symboles, tels que le symbole "raw" (brut). r pour indiquer à une chaîne de ne pas interpréter les barres obliques inverses. C'est extrêmement utile pour écrire des expressions régulières.

>>> 'foo\"'
'foo"'
>>> r'foo\"'
'foo\\"'

Les chaînes de caractères Unicode et non-Unicode peuvent être égales sur Python 2 :

>>> bird1 = unicode('unladen swallow')
>>> bird2 = 'unladen swallow'
>>> bird1 == bird2
True

mais pas sur Python 3 :

>>> x = u'asdf' # Python 3
>>> y = b'asdf' # b indicates bytestring
>>> x == y
False

12voto

Sean W Points 139

Il s'agit d'une fonctionnalité, pas d'un bogue.

Voir http://docs.python.org/howto/unicode.html et plus particulièrement la section "unicode type".

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