Ποια είναι η διαφορά μεταξύ του __str__
και του __repr__
στην Python;
Αν δεν ενεργήσετε ειδικά για να εξασφαλίσετε το αντίθετο, οι περισσότερες τάξεις δεν έχουν χρήσιμα αποτελέσματα για κανένα από τα δύο:
>>> class Sic(object): pass
...
>>> print str(Sic())
<__main__.Sic object at 0x8b7d0>
>>> print repr(Sic())
<__main__.Sic object at 0x8b7d0>
>>>
Όπως βλέπετε -- καμία διαφορά, και καμία πληροφορία πέρα από την κλάση και το id
του αντικειμένου. Αν υπερκαλύπτετε μόνο τη μία από τις δύο...:
>>> class Sic(object):
... def __repr__(object): return 'foo'
...
>>> print str(Sic())
foo
>>> print repr(Sic())
foo
>>> class Sic(object):
... def __str__(object): return 'foo'
...
>>> print str(Sic())
foo
>>> print repr(Sic())
<__main__.Sic object at 0x2617f0>
>>>
όπως βλέπετε, αν κάνετε override το __repr__
, αυτό'χρησιμοποιείται ΚΑΙ για το __str__
, αλλά όχι το αντίστροφο.
Άλλα κρίσιμα στοιχεία που πρέπει να γνωρίζετε: Το __str__
σε ένα ενσωματωμένο δοχείο χρησιμοποιεί το __repr__
, ΟΧΙ το __str__
, για τα στοιχεία που περιέχει. Και, παρά τα λόγια για το θέμα που βρίσκονται στα τυπικά έγγραφα, σχεδόν κανείς δεν μπαίνει στον κόπο να κάνει το __repr__
των αντικειμένων να είναι ένα αλφαριθμητικό που το eval
μπορεί να χρησιμοποιήσει για να φτιάξει ένα ίσο αντικείμενο (είναι απλά πολύ δύσκολο, ΚΑΙ το να μην ξέρουμε πώς εισήχθη στην πραγματικότητα η σχετική ενότητα το κάνει πραγματικά αδύνατο).
Οπότε, η συμβουλή μου: επικεντρωθείτε στο να κάνετε το __str__
λογικά αναγνώσιμο από τον άνθρωπο, και το __repr__
όσο πιο ξεκάθαρο μπορείτε, ακόμα και αν αυτό παρεμβαίνει με τον ασαφή ανέφικτο στόχο να κάνετε την επιστρεφόμενη τιμή του __repr__
'αποδεκτή ως είσοδο στο __eval__
!
__repr__
: αναπαράσταση αντικειμένου της python συνήθως η eval το μετατρέπει πίσω σε αυτό το αντικείμενο
__str__
: είναι οτιδήποτε νομίζετε ότι είναι αυτό το αντικείμενο σε μορφή κειμένου
π.χ.
>>> s="""w'o"w"""
>>> repr(s)
'\'w\\\'o"w\''
>>> str(s)
'w\'o"w'
>>> eval(str(s))==s
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1
w'o"w
^
SyntaxError: EOL while scanning single-quoted string
>>> eval(repr(s))==s
True
Από το an (An Unofficial) Python Reference Wiki (αντίγραφο αρχείου) του effbot:
υπολογίζει την "άτυπη" αναπαράσταση συμβολοσειράς ενός αντικειμένου. Αυτή διαφέρει από την __repr__
στο ότι δεν χρειάζεται να είναι μια έγκυρη έκφραση της Python: μπορεί να χρησιμοποιηθεί μια πιο βολική ή συνοπτική αναπαράσταση αντί αυτής.",