पाइथन में रीप (समझना) फ़ंक्शन


152

repr(): किसी वस्तु का मूल्यांकन योग्य स्ट्रिंग निरूपण (इसे "eval ()" कर सकता है, इसका अर्थ है कि यह एक स्ट्रिंग प्रतिनिधित्व है जो एक पायथन ऑब्जेक्ट का मूल्यांकन करता है)

दूसरे शब्दों में:

>>> x = 'foo'
>>> repr(x)
"'foo'"

प्रशन:

  1. जब मैं करता हूं तो मुझे दोहरे उद्धरण क्यों मिलते हैं repr(x)? (जब मैं उन्हें नहीं मिलता है str(x))
  2. 'foo'जब मैं करता हूं तो मुझे क्यों मिलता है eval("'foo'")और x जो वस्तु नहीं है?

जवाबों:


166
>>> x = 'foo'
>>> x
'foo'

तो नाम स्ट्रिंग xसे जुड़ा हुआ है 'foo'। जब आप उदाहरण के repr(x)लिए दुभाषिए को बुलाते हैं तो 'foo'इसके बजाय xपुकारते हैं repr('foo')

>>> repr(x)
"'foo'"
>>> x.__repr__()
"'foo'"

reprवास्तव में एक जादू प्रणाली को बुलाती है __repr__की xजो देता है, स्ट्रिंग मूल्य के प्रतिनिधित्व युक्त 'foo'करने के लिए सौंपा x। तो यह 'foo'स्ट्रिंग के अंदर लौटता है ""जिसके परिणामस्वरूप "'foo'"। इस पर विचार reprकरना एक स्ट्रिंग देना है जिसमें प्रतीकों की एक श्रृंखला होती है जिसे हम दुभाषिया में टाइप कर सकते हैं और उसी मान को प्राप्त कर सकते हैं जिसे तर्क के रूप में भेजा गया था repr

>>> eval("'foo'")
'foo'

जब हम कॉल करते हैं eval("'foo'"), तो यह वैसा ही होता है जब हम 'foo'दुभाषिया में टाइप करते हैं। जैसा कि हम सीधे ""दुभाषिया में बाहरी स्ट्रिंग की सामग्री टाइप करते हैं ।

>>> eval('foo')

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    eval('foo')
  File "<string>", line 1, in <module>
NameError: name 'foo' is not defined

यदि हम कहते हैं eval('foo'), तो यह वैसा ही है जैसा हम fooदुभाषिया में लिखते हैं । लेकिन कोई fooचर उपलब्ध नहीं है और एक अपवाद उठाया गया है।

>>> str(x)
'foo'
>>> x.__str__()
'foo'
>>> 

strऑब्जेक्ट का केवल स्ट्रिंग प्रतिनिधित्व है (याद रखें, xचर संदर्भित करता है 'foo'), इसलिए यह फ़ंक्शन स्ट्रिंग लौटाता है।

>>> str(5)
'5'

पूर्णांक 5का स्ट्रिंग प्रतिनिधित्व है '5'

>>> str('foo')
'foo'

और स्ट्रिंग का स्ट्रिंग प्रतिनिधित्व 'foo'समान स्ट्रिंग है 'foo'


क्या आप हमें कुछ उपयोग के मामलों की जानकारी दे सकते हैं, जब किसी को रीप्र फंक्शन का उपयोग करना चाहिए। मैं यह समझने में असमर्थ हूँ कि
गौरव पराशर १19'१

14

आपको इंटरएक्टिव इंटरप्रेटर पर मिलने वाली प्रतिक्रिया का reprभी उपयोग करता है। जब आप एक अभिव्यक्ति में टाइप करते हैं (इसे रहने दें expr), दुभाषिया मूल रूप से करता है result = expr; if result is not None: print repr(result)। तो आपके उदाहरण में दूसरी पंक्ति स्ट्रिंग को उस स्वरूप में दर्शा रही है जिसे fooआप चाहते हैं ( 'foo')। और फिर दुभाषिया उस के reprबढ़ाव का निर्माण करता है , जो आपको दोहरे उद्धरणों के साथ छोड़ देता है।

जब मैं दोहरे-उद्धरण और एकल उद्धरण के साथ% r को संयोजित करता हूं और उन्हें प्रिंट करता हूं, तो यह उसे प्रिंट करता है जिस तरह से मैं इसे अपने .py फ़ाइल में रखता हूं लेकिन जिस तरह से मैं इसे देखना चाहता हूं?

मुझे यकीन नहीं है कि आप यहां क्या पूछ रहे हैं। पाठ single ' and double " quotes, जब माध्यम से चलाया जाता है repr, उसमें एक प्रकार का उद्धरण शामिल होता है। बेशक, यह करता है, अन्यथा यह पायथन नियमों द्वारा एक वैध स्ट्रिंग शाब्दिक नहीं होगा। यह ठीक है कि आपने फोन करके क्या पूछा repr

यह भी ध्यान दें कि eval(repr(x)) == xसादृश्य का शाब्दिक अर्थ नहीं है। यह एक सन्निकटन है और अधिकांश (सभी?) अंतर्निहित प्रकारों के लिए सही है, लेकिन मुख्य बात यह है कि आपको reprआउटपुट देखने से प्रकार और तार्किक "मूल्य" का काफी अच्छा विचार मिलता है ।


2
मूल रूप से, यह वास्तव में शाब्दिक होने के लिए था : प्रत्येक मूल्य reprया तो कुछ होना चाहिए eval(या अपने स्रोत कोड में कॉपी और पेस्ट किया जा सकता है ) एक बराबर मूल्य का उत्पादन करने के लिए, या ऐसा कुछ जो सिंटैक्सएरोर उठाएगा जब आप कोशिश करते हैं (आमतौर पर) <…>शैली के द्वारा उत्पादित object.__repr__)। यह धीरे-धीरे वर्षों से नीचे था, और 2.7 और 3.x द्वारा यह "कई प्रकारों के लिए" सही है, और stdlib में भी अपवाद हैं (उदाहरण के लिए, namedtupleएक स्थानीय के रूप में बनाया गया एक प्रकार आपको एक repr'आप' दे सकता है) टी eval), लेकिन यह मूल विचार था।
21

7

str () का उपयोग रीप () डिबगिन डेवलपमेंट के लिए एंड यूज़र के लिए आउटपुट बनाने के लिए किया जाता है। और यह ऑब्जेक्ट के अधिकारी का प्रतिनिधित्व करता है।

उदाहरण:

>>> import datetime
>>> today = datetime.datetime.now()
>>> str(today)
'2018-04-08 18:00:15.178404'
>>> repr(today)
'datetime.datetime(2018, 4, 8, 18, 3, 21, 167886)'

आउटपुट से हम देखते हैं कि repr () दिनांक ऑब्जेक्ट का आधिकारिक प्रतिनिधित्व दर्शाता है।


3

1) स्ट्रिंग का परिणाम repr('foo')है । आपके पायथन शेल में, अभिव्यक्ति का परिणाम एक प्रतिनिधित्व के रूप में भी व्यक्त किया जाता है, इसलिए आप अनिवार्य रूप से देख रहे हैं । 'foo'repr(repr('foo'))

2) evalएक अभिव्यक्ति के परिणाम की गणना करता है। परिणाम हमेशा एक मूल्य होता है (जैसे कि एक संख्या, एक स्ट्रिंग, या एक वस्तु)। एकाधिक चर समान मान को संदर्भित कर सकते हैं, जैसे:

x = 'foo'
y = x

x और y अब समान मान को संदर्भित करते हैं।

3) मुझे नहीं पता कि आपका यहां क्या मतलब है। क्या आप एक उदाहरण पोस्ट कर सकते हैं, और आप क्या देखना चाहेंगे?


1

जब आप कहें

foo = 'bar'
baz(foo)

आप गुजर नहीं कर रहे हैं fooकरने के लिए bazकार्य करते हैं। fooकेवल एक नाम है जिसका उपयोग किसी मूल्य को दर्शाने के लिए किया जाता है, इस मामले में 'bar', और उस मान को bazफ़ंक्शन में पास किया जाता है।

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