77 votes

Python object.__repr__(self) devrait être une expression ?

J'ai regardé les méthodes d'objets intégrés dans la bibliothèque de l'UE. Documentation Python et j'étais intéressé par la documentation de object.__repr__(self) . Voici ce qu'il dit :

Appelé par la fonction intégrée repr() et par les conversions de chaînes (guillemets inversés guillemets inversés) pour calculer la représentation d'un objet. Si possible, cela devrait ressembler à une expression Python valide qui pourrait être utilisée pour recréer un objet avec la même valeur (avec un environnement environnement approprié). Si cela n'est pas possible une chaîne de la forme <...une description utile... description...> devrait être retournée. La valeur de retour doit être une chaîne de caractères objet. Si une classe définit répression () mais pas str (), alors répression () est également utilisé lorsqu'une chaîne de caractères "informelle des instances de cette classe est nécessaire.

Cette fonction est généralement utilisée pour le débogage, Il est donc important que la représentation soit riche en informations et sans ambiguïté

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

Dans la mesure du possible, cela devrait ressembler à une expression Python valide qui pourrait être utilisée pour recréer un objet avec la même valeur.

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

En général, je ne sais pas exactement ce que je dois mettre ici.

25 votes

Cette question est liée aux notes de cours officielles sur le site du MIT. 6.00.1x : Introduction à l'informatique .

74voto

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 donne un objet égal.

Si ce n'est pas possible, il devrait retourner une chaîne de caractères sous la forme de <...some useful description...> .

6 votes

Remarquez l'inconvénient d'essayer de faire en sorte que votre __repr__() produise une expression qui renvoie une copie de l'objet : vous devez supposer que le paquetage d'origine a été complètement importé. Si vous exécutez simplement les trois lignes de Georg, vous obtiendrez "NameError : name 'datetime' is not defined" parce que le paquet datetime n'a jamais été importé. Seul "date" de "datetime" a été importé.

32voto

Jeremy Ruten Points 59989

Ce devrait être une expression Python qui, lorsqu'elle est évaluée, crée un objet ayant exactement les mêmes propriétés que celui-ci. Par exemple, si vous avez un objet Fraction qui contient deux nombres entiers, un numérateur et un dénominateur, votre __repr__() ressemblerait à 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.

13voto

Ligne directrice : Si vous pouvez fournir succinctement un représentation exacte , le formater comme une expression Python (ce qui implique qu'il peut être à la fois évalué et copié directement dans le code source, dans le bon contexte). Si l'on fournit un représentation inexacte , utiliser <...> format .

Il existe de nombreuses représentations possibles pour toute valeur, mais celle qui est la plus intéressante pour les programmeurs Python est une expression qui recrée la valeur. Rappelez-vous que ceux qui comprennent le python sont le public cible - et c'est aussi pourquoi les représentations inexactes doivent inclure un contexte pertinent. Même le modèle par défaut <XXX object at 0xNNN> bien qu'il soit presque entièrement inutile, il fournit tout de même du type, id() (pour distinguer des objets différents), et l'indication qu'aucune meilleure représentation n'est disponible.

4voto

S.Lott Points 207588

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

Wow, c'est beaucoup d'émotions.

  1. Un "exemple du type d'expression que vous pourriez utiliser" ne serait pas une représentation d'un objet spécifique. Cela ne peut pas être utile ou significatif.

  2. Quelle est la différence entre "une expression réelle, qui peut ... recréer l'objet" et "un remaniement de l'expression réelle qui a été utilisée [pour créer l'objet]" ? Les deux sont une expression qui crée l'objet. Il n'y a pas de distinction pratique entre les deux. Un appel repr pourrait produire soit une nouvelle expression, soit l'expression originale. Dans de nombreux cas, c'est la même chose.

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

Dans certains cas, vous remarquerez que repr() présente une chaîne de caractères qui est clairement pas une expression de quelque nature que ce soit. La fonction repr() par défaut de toute classe que vous définissez n'est pas utile en tant qu'expression.

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

Dans de nombreux cas, un objet est construit de manière incrémentielle via un analyseur syntaxique. Par exemple, à partir de XML ou JSON ou autre. Quelle serait la répression ? Le XML ou JSON original ? Manifestement non, puisqu'il ne s'agit pas de Python. Ce pourrait être une expression Python qui a généré le XML. Cependant, pour un gigantesque document XML, il ne serait peut-être pas possible d'écrire une seule expression Python qui soit l'équivalent fonctionnel de l'analyse syntaxique du XML.

0 votes

C'est pour ça : Si cela n'est pas possible (pour créer une expression Python valide), une chaîne de la forme <...une description utile...> doit être retournée. Si vous ne pouvez pas fournir une chaîne qui se traduirait directement en code, fournissez simplement une description utile, en '<...>'.

4voto

markchern Points 39

Le terme "repr" signifie "représentation". Tout d'abord, nous créons une instance de la classe coordinate.

x = Coordinate(3, 4) 

Ensuite, si nous entrons x dans la console, la sortie est la suivante

<__main__.Coordinate at 0x7fcd40ab27b8>

Si vous utilisez repr() :

>>> repr(x)
Coordinate(3, 4)

La sortie est la même que 'Coordinate(3, 4)', sauf que c'est une chaîne de caractères. Vous pouvez l'utiliser pour recréer une instance de coordonnée.

En conclusion, la méthode repr() permet d'imprimer une chaîne de caractères, qui est la représentation de l'objet.

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