अजगर का __repr__ का उद्देश्य


139
def __repr__(self):
  return '<%s %s (%s:%s) %s>' % (
    self.__class__.__name__, self.urlconf_name, self.app_name,
    self.namespace, self.regex.pattern)

इस विधि का महत्व / उद्देश्य क्या है?


@ zjm1126: क्या आप जानना चाहते हैं >>> variableकि __repr__()रिटर्न क्यों छापता है?
एस्टेबन कुबेर

18
यह दस्तावेज लोगों को सोने के लिए प्रेरित करता है। साथ ही, यह दूसरों से सीखने में सहायक है कि यह कैसे उपयोग किया जाता है।
चिंतित_किसान


2
जावा डेवलपर्स के लिए जो पायथन सीख रहे हैं, इस पर ध्यान देने का सबसे अच्छा तरीका जावा में स्ट्रींग () है।
रवि

जवाबों:


188

__repr__वस्तु का मुद्रण योग्य प्रतिनिधित्व, सबसे अधिक संभावना लौट जाना एक संभव तरीके इस वस्तु बनाने के लिए की। आधिकारिक दस्तावेज यहां देखें । __repr__डेवलपर्स के लिए अधिक है जबकि __str__अंतिम उपयोगकर्ताओं के लिए है।

एक सरल उदाहरण:

>>> class Point:
...   def __init__(self, x, y):
...     self.x, self.y = x, y
...   def __repr__(self):
...     return 'Point(x=%s, y=%s)' % (self.x, self.y)
>>> p = Point(1, 2)
>>> p
Point(x=1, y=2)

2
lazy1: मैं मुख्य रूप से फ़ॉर्मेटिंग को ठीक करना चाहता था (उदाहरणों में नमूना सत्र में इसे देखने के साथ-साथ उदाहरणों का मिलान करना उपयोगी होता है), लेकिन मैंने आउटपुट प्रारूप को भी स्पष्ट रूप से असाइनमेंट से अलग होने के लिए बदल दिया, जैसा कि बहुत इस पर उलझन में किसी के लिए स्पष्टता में सुधार, imho। (यदि मैं बहुत दूर चला गया हूँ, तो बस फिर से संपादित करूँगा, और मैं आपको एक बियर दूंगा।)

2
संदर्भ संदर्भित: docs.python.org/reference/datamodel.html#object.__repr__
S.Lott

1
इसे शायद% s के बजाय% r का उपयोग करना चाहिए: stackoverflow.com/questions/6005159/…
जोनाथन एडल्सन

43
यह वास्तव में सही नहीं है। __str__वह आउटपुट है जिसे मानव पठनीय __repr__माना जाता है : माना जाता है कि पाइथन इंटरप्रेटर के लिए पठनीय है (यानी इंटरप्रेटर को स्ट्रिंग को फीड करना ऑब्जेक्ट को फिर से बनाना चाहिए)। यदि किसी ऑब्जेक्ट में एक __str__विधि नहीं है , हालांकि, __repr__इसके बजाय उपयोग किया जाता है। जैसा कि उल्लेख किया गया है: यह उदाहरण वास्तव में की __str__विधि को प्रिंट करता है self.xऔर self.y: स्ट्रिंग प्रारूपण ऑपरेशन के %rबजाय इसका उपयोग किया जाना चाहिए %s(क्योंकि वर्ग परिभाषित नहीं करता है __str__, __repr__वास्तव में वैसे भी वापस आ जाता है, लेकिन यह एक विसंगति है)।
डैनियल एंडरसन

20

यह पायथन प्रलेखन में बहुत अच्छी तरह से समझाया गया है :

repr ( ऑब्जेक्ट ): किसी स्ट्रिंग को किसी ऑब्जेक्ट के प्रिंट करने योग्य प्रतिनिधित्व से युक्त करें। यह रूपांतरणों (रिवर्स कोट्स) द्वारा प्राप्त समान मूल्य है। कभी-कभी एक साधारण फ़ंक्शन के रूप में इस ऑपरेशन तक पहुंचने में सक्षम होना उपयोगी होता है। कई प्रकारों के लिए, यह फ़ंक्शन एक स्ट्रिंग को वापस करने का प्रयास करता है, जो पास होने पर उसी मूल्य के साथ एक वस्तु प्राप्त करेगा eval(), अन्यथा प्रतिनिधित्व कोण कोष्ठक में संलग्न एक स्ट्रिंग है जिसमें अतिरिक्त जानकारी के साथ ऑब्जेक्ट के प्रकार का नाम शामिल है अक्सर वस्तु का नाम और पता सहित। एक वर्ग इस बात को नियंत्रित कर सकता है कि यह फ़ंक्शन किस __repr__()विधि को परिभाषित करके अपने उदाहरणों के लिए वापस लौटता है ।

तो जो आप यहां देख रहे हैं वह डिफ़ॉल्ट कार्यान्वयन है __repr__, जो क्रमांकन और डीबगिंग के लिए उपयोगी है।


5
मुझे लगता है कि किसी वस्तु के "प्रतिनिधित्व" को प्राप्त करने की रिवर्स कोट्स (या 'बैकटिक्स') विधि को हटा दिया गया है, और संस्करण 3.0 के लिए हटा दिया गया है
MatrixFrog

MatrixFrog: दोनों सच है, लेकिन वर्तमान 2.x प्रलेखन अभी भी यह कहता है, जो कि बोली कहां से है।

कई वस्तुओं के लिए, __repr__ और __str__ समान कार्य हैं। वास्तव में, यदि आप केवल __str__ को परिभाषित करते हैं, तो __repr__ केवल __str__ को कॉल करने में चूक करता है। सबसे स्पष्ट मामला जहां यह सच नहीं है, वह स्वयं तार है: str ('स्टैकओवरफ़्लो') रिटर्न करता है, stackoverflowलेकिन repr ('स्टैकवर्फ़्लोफ़') है 'stackoverflow'
MatrixFrog

6
आपके पास है कि पीछे की ओर, __repr__ कभी भी __str__ का उपयोग नहीं करता है, लेकिन रिवर्स हो सकता है। देखें docs.python.org/reference/...

13

__repr__कक्षा को प्रिंट करने योग्य प्रारूप में प्रदर्शित करने के लिए स्टैंडअलोन पायथन दुभाषिया द्वारा उपयोग किया जाता है। उदाहरण:

~> python3.5
Python 3.5.1 (v3.5.1:37a07cee5969, Dec  5 2015, 21:12:44) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> class StackOverflowDemo:
...     def __init__(self):
...         pass
...     def __repr__(self):
...         return '<StackOverflow demo object __repr__>'
... 
>>> demo = StackOverflowDemo()
>>> demo
<StackOverflow demo object __repr__>

ऐसे मामलों में जहां एक __str__विधि को कक्षा में परिभाषित नहीं किया जाता है, यह __repr__प्रिंट करने योग्य प्रतिनिधित्व बनाने के प्रयास में फ़ंक्शन को कॉल करेगा ।

>>> str(demo)
'<StackOverflow demo object __repr__>'

इसके अतिरिक्त, print()कक्षा को __str__डिफ़ॉल्ट रूप से कॉल करेगा ।


प्रलेखन , यदि आप कृपया



1

उनके बीच अंतर देखने के लिए एक उदाहरण (मैंने इस स्रोत से कॉपी किया ),

>>> x=4
>>> repr(x)
'4'
>>> str(x)
'4'
>>> y='stringy'
>>> repr(y)
"'stringy'"
>>> str(y)
'stringy'

के रिटर्न repr()और str()के लिए समान हैं int x, लेकिन वहाँ के लिए बदले मूल्यों में अंतर होता है str y- एक है औपचारिक और अन्य है अनौपचारिक । औपचारिक और अनौपचारिक अभ्यावेदन के बीच सबसे महत्वपूर्ण अंतर यह है कि __repr__एक स्ट्रिंग मूल्य के लिए डिफ़ॉल्ट कार्यान्वयन को निष्कासन के तर्क के रूप में कहा जा सकता है, और वापसी मूल्य इस तरह एक वैध स्ट्रिंग ऑब्जेक्ट होगा:

>>> repr(y)
"'a string'"
>>> y2=eval(repr(y))
>>> y==y2
True

यदि आप __str__निकासी के तर्क के रूप में रिटर्न वैल्यू को कॉल करने का प्रयास करते हैं , तो परिणाम मान्य नहीं होगा।


1

जब हम कक्षाओं को परिभाषित करके नए प्रकार का निर्माण करते हैं, तो हम नई कक्षाओं का उपयोग करने के लिए सुविधाजनक बनाने के लिए पायथन की कुछ विशेषताओं का लाभ उठा सकते हैं। इन विशेषताओं में से एक "विशेष विधियां" हैं, जिन्हें "जादू विधियों" के रूप में भी जाना जाता है।

विशेष विधियों के नाम हैं जो दो अंडरस्कोर के साथ शुरू और समाप्त होते हैं। हम उन्हें परिभाषित करते हैं, लेकिन आमतौर पर उन्हें सीधे नाम से नहीं बुलाते हैं। इसके बजाय, वे विशिष्ट परिस्थितियों में स्वचालित रूप से निष्पादित करते हैं।

प्रिंट स्टेटमेंट का उपयोग करके किसी वस्तु के उदाहरण के मूल्य को आउटपुट करने में सक्षम होना सुविधाजनक है। जब हम ऐसा करते हैं, तो हम चाहेंगे कि आउटपुट को कुछ समझ से बाहर के प्रारूप में दर्शाया जाए। ऐसा होने की व्यवस्था करने के लिए रीप स्पेशल विधि का उपयोग किया जा सकता है। यदि हम इस पद्धति को परिभाषित करते हैं, तो यह स्वचालित रूप से कहा जा सकता है जब हम उस वर्ग के उदाहरण का मूल्य प्रिंट करते हैं जिसके लिए हमने इस पद्धति को परिभाषित किया था। यह उल्लेख किया जाना चाहिए, हालांकि, वहाँ भी एक है कि str विशेष विधि, एक समान के लिए इस्तेमाल किया, लेकिन नहीं समान उद्देश्य, कि पूर्वता मिल सकता है, अगर हम भी इसे परिभाषित किया है।

हम परिभाषित नहीं किया है, रेपर Point3D वर्ग के लिए विधि, और Point3D का एक उदाहरण के रूप में instantiated my_point है, और फिर हम ऐसा करते हैं ...

my_point प्रिंट करें ... हम इसे आउटपुट के रूप में देख सकते हैं ...

बहुत अच्छा नहीं है, एह?

तो, हम बेहतर उत्पादन प्राप्त करने के लिए repr या str विशेष विधि या दोनों को परिभाषित करते हैं ।

**class Point3D(object):
    def __init__(self,a,b,c):
        self.x = a
        self.y = b
        self.z = c
    def __repr__(self):
        return "Point3D(%d, %d, %d)" % (self.x, self.y, self.z)
    def __str__(self):
        return "(%d, %d, %d)" % (self.x, self.y, self.z)
my_point = Point3D(1, 2, 3)
print my_point # __repr__ gets called automatically
print my_point # __str__ gets called automatically**

आउटपुट ...

(1, 2, 3) (1, 2, 3)


0

आपके द्वारा कार्यान्वित हर वर्ग के लिए repr को लागू करें। कोई बहाना नहीं होना चाहिए। लागू str वर्ग है जो आपको लगता है पठनीयता गैर अस्पष्टता की ज्यादा महत्वपूर्ण है के लिए।

इस लिंक को देखें: https://www.pythoncentral.io/what-is-the-difference-between- str -and- repr -in-python /

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.