68 votes

Objet Python .__ repr __ (self) devrait être une expression?

J'ai été à la recherche à la builtin méthodes de l'objet dans la documentation Python, et j'ai été intéressé dans la documentation pour l' object.__repr__(self). Voici ce qu'il dit:

Appelé par le repr() fonction intégrée et par la conversion en chaîne (inverse les guillemets) pour calculer la "officielle" représentation sous forme de chaîne d'un objet. Si en tout cas, cela devrait ressembler à un Python expression qui pourrait être utilisée pour recréer un objet avec la même valeur (soit approprié de l'environnement). Si ce n'est pas possible, une chaîne de la forme <...utile description...> doit être retourné. La valeur de retour doit être une chaîne de caractères objet. Si une classe définit repr() mais pas de str(), puis repr() est également utilisé lorsqu'un "informelle" de la chaîne la représentation des instances de cette la classe est nécessaire.

Ceci est généralement utilisé à des fins de débogage, il est donc important que l' la représentation est riche en informations et sans ambiguïté

La partie la plus intéressante pour moi, c'était...

Si à tout possible, il devrait ressembler à un Python expression qui pourrait être utilisée pour recréer un objet avec la même valeur

... mais je ne suis pas sûr exactement ce que cela signifie. Il dit qu'il doit regarder comme une expression qui peut être utilisé pour recréer l'objet, mais est-ce à dire qu'il devrait simplement être un exemple du genre d'expression que vous pourriez utiliser, ou faut-il une réelle expression, qui peut être exécuté (eval etc..) pour recréer l'objet? Ou... doit-il être juste un rehasing de l'expression qui a été utilisée, par pure des fins d'information?

En général, je suis un peu confus sur exactement ce que je devrait mettre ici.

64voto

Georg Schölly Points 63123
 >>> from datetime import date
>>>
>>> repr(date.today())        # calls date.today().__repr__()
'datetime.date(2009, 1, 16)'
>>> eval(_)                   # _ is the output of the last command
datetime.date(2009, 1, 16)
 

La sortie est une chaîne qui peut être analysée par l'interpréteur python et aboutit à un objet égal.

Si ce n'est pas possible, il devrait renvoyer une chaîne sous la forme <...some useful description...> .

31voto

Jeremy Ruten Points 59989

Ce doit être une expression Python qui, une fois évaluée, crée un objet avec exactement les mêmes propriétés que celui-ci. Par exemple, si vous avez une classe Fraction qui contient deux entiers, un numérateur et un dénominateur, votre méthode __repr__() devrait ressembler à ceci:

 # in the definition of Fraction class
def __repr__(self):
    return "Fraction(%d, %d)" % (self.numerator, self.denominator)
 

En supposant que le constructeur prenne ces deux valeurs.

4voto

S.Lott Points 207588

"mais est-ce à dire qu'il devrait simplement être un exemple du genre d'expression que vous pourriez utiliser, ou faut-il une réelle expression, qui peut être exécuté (eval etc..) pour recréer l'objet? Ou... doit-il être juste un rehasing de l'expression qui a été utilisée, par pure des fins d'information?"

Wow, c'est beaucoup d'essorage.

  1. "Un exemple de cette sorte d'expression, vous pourriez utiliser" ne serait pas une représentation d'un objet spécifique. Qui ne peut pas être utile ou utile.

  2. Quelle est la différence entre "une réelle expression, qui peut ... recréer l'objet" et "un rehasing de l'expression qui a été utilisée [créer l'objet]"? Les deux sont une expression qui crée l'objet. Il n'y a plus aucune distinction entre ces. Un repr d'appel pourrait produire une nouvelle expression ou de l'expression d'origine. Dans de nombreux cas, ils sont les mêmes.

Notez que ce n'est pas toujours possible ou pratique, ou souhaitable.

Dans certains cas, vous remarquerez que repr() présente une chaîne qui n'est clairement pas une expression d'aucune sorte. La valeur par défaut repr() pour toute classe de définir n'est pas utile en tant qu'expression.

Dans certains cas, vous pouvez avoir mutuelle (ou circulaire) références entre objets. La repr() de cette hiérarchie enchevêtrée ne peut pas faire sens.

Dans de nombreux cas, un objet est construit progressivement par l'intermédiaire d'un analyseur. Par exemple, à partir de XML ou JSON ou quelque chose. Quelles seraient les repr? L'original XML ou JSON? Clairement pas, car ils ne sont pas en Python. Cela pourrait être une expression Python qui a généré le fichier XML. Cependant, pour un gigantesque document XML, il peut ne pas être possible d'écrire une seule expression Python qui est l'équivalent fonctionnel de l'analyse de XML.

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: