str() और repr() दोनों ऑब्जेक्ट्स का स्ट्रिंग रिप्रेजेंटेशन देते हैं, लेकिन उनके उद्देश्य अलग हैं।
आधिकारिक परिभाषा
- str(x): "अनौपचारिक" या पठनीय रिप्रेजेंटेशन। अंतिम उपयोगकर्ता के लिए।
- repr(x): "आधिकारिक" या अनौपचारिक रिप्रेजेंटेशन। डेवलपर/डीबगिंग के लिए। आदर्श रूप से
eval(repr(x)) == xहोना चाहिए।
बुनियादी अंतर
>>> str(123)
'123'
>>> repr(123)
'123'
>>> # इंट के लिए समान
>>> str('Python')
'Python'
>>> repr('Python')
"'Python'" # कोट्स शामिल!
महत्वपूर्ण अंतर: eval() के साथ
>>> x = "Python"
>>> repr(x)
"'Python'"
>>> x1 = eval(repr(x))
>>> x == x1
True
>>> y = "Python"
>>> str(y)
'Python'
>>> y1 = eval(str(y)) # NameError: name 'Python' is not defined
Traceback (most recent call last):
...
NameError: name 'Python' is not defined
repr() का आउटपुट वैध पायथन एक्सप्रेशन होता है जिसे eval() से पुनर्निर्मित किया जा सकता है। str() का नहीं।
डेटाटाइम उदाहरण
>>> import datetime
>>> now = datetime.datetime.now()
>>> str(now)
'2019-03-29 01:29:23.211924'
>>> repr(now)
'datetime.datetime(2019, 3, 29, 1, 29, 23, 211924)'
str(now): मानव-पठनीय तारीख/समय।repr(now): ऑब्जेक्ट को पुनर्निर्मित करने वाला पायथन कोड।
मुख्य अंतर तालिका
| str() | repr() |
|---|---|
| ऑब्जेक्ट को पठनीय बनाता है | ऑब्जेक्ट को पुनर्निर्मित करने वाला कोड |
| अंतिम उपयोगकर्ता के लिए आउटपुट | डेवलपर/डीबगिंग के लिए आउटपुट |
__str__ डिफ़ॉल्ट | __repr__ फॉलबैक |
कस्टम क्लासेज़ में लागू करना
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return f"Point({self.x}, {self.y})"
def __repr__(self):
return f"Point({self.x}, {self.y})"
p = Point(3, 4)
print(str(p)) # Point(3, 4)
print(repr(p)) # Point(3, 4)
# eval(repr(p)) काम करेगा यदि Point स्कोप में है
सर्वोत्तम अभ्यास
- __repr__ हमेशा परिभाषित करें - यह डीबगिंग के लिए महत्वपूर्ण है।
- __str__ उपयोगकर्ता-मुखी आउटपुट के लिए परिभाषित करें।
- यदि
__str__परिभाषित नहीं है, तो पायथन__repr__पर फॉलबैक करता है।