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.
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:
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
Il appelle repr()
sur l'objet et insère la chaîne résultante.
il imprime le remplacement comme une chaîne de caractères avec repr()
.
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.
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.
%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'