পাইথনে 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' >>> #Above we see- with integer data, there is no difference >>> #Now let's try string data on these two methods >>> str('Python') 'Python' >>> repr('Python') "'Python'"
পূর্ণসংখ্যা মানের জন্য repr() এবং str() এর রিটার্ন একই, কিন্তু স্ট্রিং এর জন্য রিটার্ন মানের মধ্যে পার্থক্য রয়েছে – একটি আনুষ্ঠানিক এবং অন্যটি অনানুষ্ঠানিক৷
এখন আপনি যদি অফিসিয়াল পাইথন ডকুমেন্টেশন দেখে যান - __str__ একটি বস্তুর "অনুষ্ঠানিক" (পঠনযোগ্য) স্ট্রিং উপস্থাপনা খুঁজে পেতে ব্যবহৃত হয় যেখানে __repr__ একটি বস্তুর "অফিসিয়াল" স্ট্রিং উপস্থাপনা খুঁজে পেতে ব্যবহৃত হয়।
আনুষ্ঠানিক এবং অনানুষ্ঠানিক উপস্থাপনার মধ্যে পার্থক্য হল একটি str মানের জন্য __repr__ এর ডিফল্ট বাস্তবায়নকে ইভাল করার জন্য একটি আর্গুমেন্ট হিসাবে বলা যেতে পারে এবং রিটার্ন মানটি একটি বৈধ স্ট্রিং অবজেক্ট হবে। এই ফাংশন (repr()) একটি স্ট্রিং নেয় এবং পাইথন কোড হিসাবে এটির বিষয়বস্তু মূল্যায়ন করে।
সুতরাং যখন আমরা এটিতে "পাইথন" পাস করি, তখন এর কাজ। যাইহোক, 'পাইথন' একটি ত্রুটির দিকে নিয়ে যায় কারণ এটিকে পরিবর্তনশীল পাইথন হিসাবে ব্যাখ্যা করা হয় যা অবশ্যই অনির্ধারিত। এটা বোঝার জন্য নিচে কোড দেওয়া হল -
>>> x = "Python" >>> repr(x) "'Python'" >>> x1 = eval (repr(x)) >>> x == x1 True
তাই যদি আমরা __str__ এর রিটার্ন মানটিকে ইভাল করার যুক্তি হিসাবে কল করার চেষ্টা করি, এটি ব্যর্থ হয়।
>>> y = "Python" >>> str(y) 'Python' >>> y1 = eval(str(y)) Traceback (most recent call last): File "<pyshell#51>", line 1, in <module> y1 = eval(str(y)) File "<string>", line 1, in <module> 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) এখন এর মান ধারণকারী একটি স্ট্রিং গণনা করে যেখানে repr(now) আবার আমাদের এখন অবজেক্ট পুনর্নির্মাণের জন্য প্রয়োজনীয় পাইথন কোড ফেরত দেয়।
মূল পার্থক্য
str() | repr() |
---|---|
অবজেক্টকে পাঠযোগ্য করুন | প্রয়োজনীয় কোড যা বস্তুর পুনরুত্পাদন করে |
শেষ ব্যবহারকারীর জন্য আউটপুট তৈরি করুন | ডেভেলপারের জন্য আউটপুট তৈরি করুন |
আপনার ক্লাসের জন্য __str__ এবং __repr__ লেখার সময় উপরের পয়েন্টগুলি বিবেচনা করা দরকার।