পাইথনে পুনরায় () ফাংশন বোঝা


152

repr(): কোনও অবজেক্টের মূল্যায়নযোগ্য স্ট্রিং প্রতিনিধিত্ব (এটি "eval ()" করতে পারে, মানে এটি একটি স্ট্রিং প্রতিনিধিত্ব যা পাইথন অবজেক্টকে মূল্যায়ন করে)

অন্য কথায়:

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

প্রশ্নাবলী:

  1. আমি কেন ডাবল উদ্ধৃতি পেতে পারি repr(x)? (আমি যখন তা করি তখন তা পাই না str(x))
  2. আমি 'foo'যখন করব eval("'foo'")এবং কেন না যা এক্সটি হ'ল অবজেক্টটি?

উত্তর:


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'


যখন কেউ পুনরায় ফাংশন ব্যবহার করা উচিত তখন আপনি আমাদের কিছু ব্যবহারের ক্ষেত্রেও জানতে পারেন। আমি তা বুঝতে অক্ষম
গৌরব পরাশর

14

ইন্টারেক্টিভ ইন্টারপ্রেটারে আপনি যে প্রতিক্রিয়া পান সেগুলিও ব্যবহার reprকরে। আপনি যখন কোনও অভিব্যক্তি টাইপ করেন (এটি হতে দিন expr), দোভাষা মূলত তা করে result = expr; if result is not None: print repr(result)। সুতরাং আপনার উদাহরণে দ্বিতীয় লাইন হয় স্ট্রিং বিন্যাস fooউপস্থাপনা মধ্যে যদি আপনি চান ( 'foo')। এবং তারপর অনুবাদক সৃষ্টি reprএর esentation যে , ডবল কোট দিয়ে আপনি যাব।

আমি যখন ডাবল-কোট এবং একক উদ্ধৃতি দিয়ে পালিয়ে এসে মুদ্রণ করব তখন এটি আমার .পি ফাইলে যেভাবে লিখতে হবে তার প্রিন্ট করে তবে আমি এটি দেখতে চাই না কেন?

আমি নিশ্চিত আপনি এখানে কি জিজ্ঞাসা করছি। পাঠ্যটি single ' and double " quotesযখন চালিত হয় তখন reprএক ধরণের উদ্ধৃতি দিয়ে পালিয়ে যায়। অবশ্যই এটি আছে, অন্যথায় এটি পাইথন বিধি দ্বারা বৈধ স্ট্রিং আক্ষরিক হবে না। যে অবিকল কি কল করে জানতে চাওয়া হচ্ছে repr

এছাড়াও লক্ষ করুন যে eval(repr(x)) == xসাদৃশ্যটি আক্ষরিক নয়। এটি একটি আনুমানিক এবং এটি বেশিরভাগ (সমস্ত?) অন্তর্নির্মিত প্রকারের জন্য সত্য, তবে মূল বিষয়টি হ'ল reprআউটপুটটি দেখে আপনি টাইপ এবং যৌক্তিক "মান" সম্পর্কে মোটামুটি ভাল ধারণা পান ।


2
মূলত, এটি আসলে আক্ষরিক অর্থেই বোঝানো হয়েছিল : প্রতিটি মানই হয় এমন reprএকটি হওয়া উচিত evalযা একটি সমমানের মান তৈরি করতে (বা আপনার উত্স কোডটিতে অনুলিপি করা এবং আটকানো) করা যেতে পারে, বা এমন কিছু যা আপনি চেষ্টা করার সময় একটি সিনট্যাক্সরর উত্থাপন করবে (সাধারণত <…>শৈলী দ্বারা উত্পাদিত object.__repr__)। বছরের পর বছর ধরে এটি ধীরে ধীরে টোন করা হয়েছিল, এবং 2.7 এবং 3.x দ্বারা এটি "অনেক ধরণের ক্ষেত্রে" ঠিক সত্য, এবং এমনকি স্টাডলিবগুলিতেও ব্যতিক্রম রয়েছে (উদাহরণস্বরূপ, namedtupleস্থানীয় হিসাবে তৈরি একটি ধরণ আপনাকে দেবে যা দিতে reprপারে ' টি eval), তবে এটি আসল ধারণা ছিল।
অবার্নেট

7

স্ট্রিম () শেষ ব্যবহারকারীর জন্য আউটপুট তৈরি করার জন্য ব্যবহৃত হয় যখন ডিপ্রিগিন বিকাশের জন্য repr () ব্যবহার করা হয় nd এবং এটি অবজেক্টের আধিকারিকের প্রতিনিধিত্ব করে।

উদাহরণ:

>>> 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ফাংশনে প্রেরণ করা হয় ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.