পাইথনে str() এবং repr() দুটি মেথড স্ট্রিং রিপ্রেজেন্টেশনের জন্য ব্যবহৃত হয়। যদিও তারা একই উদ্দেশ্য পরিবেশন করতে মনে হয়, তাদের মধ্যে কিছু পার্থক্য রয়েছে।
আপনি কি লক্ষ্য করেছেন যখন আপনি পাইথন বিল্ট-ইন ফাংশন str(x) কল করেন যেখানে x হলো আপনি যা চান এমন যেকোনো অবজেক্ট? str(x)-এর রিটার্ন ভ্যালু দুটি মেথডের ওপর নির্ভর করে: __str__ ডিফল্ট চয়েস এবং __repr__ ফলব্যাক হিসেবে।
প্রথমে পাইথন ডকুমেন্টেশন কী বলে তা দেখি:
>>> help(str) Help on class str in module builtins: class str(object) | str(object='') -> str | str(bytes_or_buffer[, encoding[, errors]]) -> str | | Create a new string object from the given object. >>> help(repr) Help on built-in function repr in module builtins: repr(obj, /) Return the canonical string representation of the object. For many object types, including most builtins, eval(repr(obj)) == obj.
এখন কিছু উদাহরণ দিয়ে এই দুটি মেথড বুঝি:
>>> str(123)
'123'
>>> repr(123)
'123'
>>> # উপরে দেখতে পাচ্ছি - ইন্টিজার ডেটার সাথে কোনো পার্থক্য নেই
>>> # এখন এই দুটি মেথডে স্ট্রিং ডেটা ট্রাই করি
>>> str('Python')
'Python'
>>> repr('Python')
"'Python'"
ইন্টিজার ভ্যালুর জন্য repr() এবং str()-এর রিটার্ন একই, কিন্তু স্ট্রিং-এর জন্য রিটার্ন ভ্যালুর মধ্যে পার্থক্য রয়েছে - একটি ফরম্যাল এবং অন্যটি ইনফরম্যাল।
আপনি অফিসিয়াল পাইথন ডকুমেন্টেশন অনুসরণ করলে - __str__ একটি অবজেক্টের "ইনফরম্যাল" (পঠনযোগ্য) স্ট্রিং রিপ্রেজেন্টেশন খুঁজে বের করতে ব্যবহৃত হয়, আর __repr__ একটি অবজেক্টের "অফিসিয়াল" স্ট্রিং রিপ্রেজেন্টেশন খুঁজে বের করতে ব্যবহৃত হয়।
ফরম্যাল এবং ইনফরম্যাল রিপ্রেজেন্টেশনের পার্থক্য হলো, একটি স্ট্রিং ভ্যালুর জন্য __repr__-এর ডিফল্ট ইমপ্লিমেন্টেশনকে eval-র আর্গুমেন্ট হিসেবে কল করা যায়, এবং রিটার্ন ভ্যালু একটি বৈধ স্ট্রিং অবজেক্ট হবে। এই ফাংশন (repr()) একটি স্ট্রিং নেয় এবং এর কন্টেন্টকে পাইথন কোড হিসেবে ইভ্যালুয়েট করে।
সুতরাং যখন আমরা "'Python'" পাস করি, এটি কাজ করে। কিন্তু 'Python' এরর দেবে কারণ এটি ভেরিয়েবল Python হিসেবে ইন্টারপ্রেট করা হয় যা অবশ্যই অনডিফাইনড। নিচে কোড দেওয়া হলো:
>>> x = "Python" >>> repr(x) "'Python'" >>> x1 = eval(repr(x)) >>> x == x1 True
তবে যদি আমরা __str__-এর রিটার্ন ভ্যালুকে eval-র আর্গুমেন্ট হিসেবে কল করার চেষ্টা করি, তবে এটি ব্যর্থ হবে।
>>> y = "Python" >>> str(y) 'Python' >>> y1 = eval(str(y)) Traceback (most recent call last): File "", line 1, in y1 = eval(str(y)) File " ", line 1, in NameError: name 'Python' is not defined
দুটি মেথডের পার্থক্য প্রদর্শন করার আরেকটি উদাহরণ:
>>> 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) now-এর মান ধারণকারী একটি স্ট্রিং কম্পিউট করে, আর repr(now) আবার আমাদের now অবজেক্ট পুনর্নির্মাণের জন্য পাইথন কোড রিটার্ন করে।
মূল পার্থক্য
| str() | repr() |
|---|---|
| অবজেক্টকে পঠনযোগ্য করে | অবজেক্ট পুনরুত্পাদনের কোড দরকার |
| এন্ড ইউজারের জন্য আউটপুট জেনারেট করে | ডেভেলপারের জন্য আউটপুট জেনারেট করে |
আপনার ক্লাসের জন্য __str__ এবং __repr__ লিখতে समय উপরের পয়েন্টগুলো বিবেচনা করতে হবে।