Quelle est la signification de %r en python?

Quelle est la signification de %r dans la déclaration suivante?

print '%r' % (1)

je pense que j'ai entendu parler de %s , %d , et %f mais jamais entendu parler de cela.

52
demandé sur TM. 2010-03-01 10:13:09

6 réponses

Contexte:

en Python, il y a deux fonctions intégrées pour transformer un objet en chaîne: str vs. repr . str est censé être une chaîne amicale, lisible par l'homme. repr est censé inclure des informations détaillées sur le contenu d'un objet (parfois, ils retourneront la même chose, comme pour les entiers). Par convention, s'il y a une expression Python qui va eval à un autre objet qui est ==, repr retournera une telle expression par exemple

>>> print repr('hi')
'hi'  # notice the quotes here as opposed to...
>>> print str('hi')
hi

si retourner une expression n'a pas de sens pour un objet, repr devrait retourner une chaîne qui est entourée de symboles < et > par exemple <blah> .

pour répondre à votre question initiale:

%s <-> str

%r <-> repr

en outre:

vous pouvez contrôler la façon dont une instance de vos propres classes convertit en chaînes en implémentant les méthodes __str__ et __repr__ .

class Foo:

  def __init__(self, foo):
    self.foo = foo

  def __eq__(self, other):
    """Implements ==."""
    return self.foo == other.foo

  def __repr__(self):
    # if you eval the return value of this function,
    # you'll get another Foo instance that's == to self
    return "Foo(%r)" % self.foo
67
répondu allyourcode 2014-08-13 17:18:02

Il appelle repr() sur l'objet et insère la chaîne résultante.

20
répondu Ignacio Vazquez-Abrams 2010-03-01 07:15:08

il imprime le remplacement comme une chaîne de caractères avec repr() .

4
répondu Xorlev 2010-03-01 07:15:47

en ajoutant aux réponses données ci-dessus, '%r' peut être utile dans un scénario où vous avez une liste avec un type de données hétérogène. Disons que nous avons un list = [1, 'apple' , 2 , 'r','banana'] De toute évidence, dans ce cas, l'utilisation de '%d' ou '%s' causerait une erreur. Au lieu de cela, nous pouvons utiliser '%r' pour imprimer toutes ces valeurs.

3
répondu Hetal Patel 2017-10-02 17:28:55

voir opérations de formatage de chaîne dans les docs. Notez que %s et %d etc, pourraient fonctionner différemment de ce que vous attendez si vous êtes habitué à la façon dont ils fonctionnent dans une autre langue comme C.

en particulier, %s fonctionne aussi bien pour les ints et les floats à moins que vous ayez des exigences spéciales de formatage où %d ou %f vous donnera plus de contrôle.

0
répondu John La Rooy 2013-12-17 04:32:03
%s <=> str
%r <=> repr

%r appels repr() sur l'objet, et insère la chaîne de résultat retourné par __repr__ .

la chaîne renvoyée par __repr__ doit être non ambiguë et, si possible, correspondre au code source nécessaire pour recréer l'objet représenté.

un exemple rapide:

class Foo:

    def __init__(self, foo):
        self.foo = foo


    def __repr__(self):
        return 'Foo(%r)' % self.foo

    def __str__(self):
        return self.foo


test = Foo('Text')

,

in[1]: test
Out[1]: Foo('Text')


in[2]: str(test)
Out[2]: 'Text'
0
répondu sheldonzy 2017-12-22 19:11:51