পাইথনের __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
অলস 1: আমি প্রাথমিকভাবে ফর্ম্যাটিংটি ঠিক করতে চেয়েছিলাম (উদাহরণগুলির সাথে যতটা সম্ভব নমুনা অধিবেশনটিতে তারা দেখতে পাবে তার সাথে মিল রাখা ভাল) তবে আমি আউটপুট ফর্ম্যাটটিকে স্পষ্টভাবে অ্যাসাইনমেন্ট থেকে পৃথক করার জন্য টুইক করেছি that এই সম্পর্কে বিভ্রান্ত কারওর জন্য স্পষ্টতাকে বৃহত্তরভাবে উন্নত করে, ইমো। (আমি যদি আরও দূরে চলে যাই তবে কেবল পুনরায় সম্পাদনা করুন এবং আমি আপনাকে একটি বিয়ার দেব।)

2
রেফারেন্সটি দেওয়া হয়েছে: docs.python.org/references/datamodel.html#object.__repr__
এস লট

1
এটি সম্ভবত% s এর পরিবর্তে% r ব্যবহার করা উচিত: stackoverflow.com/questions/6005159/…
জোনাথন অ্যাডেলসন

43
এটি আসলে সঠিক নয়। __str__হ'ল আউটপুট যা মানব পাঠযোগ্য __repr__বলে মনে করা হয়: পাইথন ইন্টারপ্রেটারের (যেমন দোভাষীকে স্ট্রিং খাওয়ানো উচিত বস্তুটি পুনরায় তৈরি করা উচিত) এর জন্য একটি উপস্থাপনা পাঠযোগ্য। যদি কোনও অবজেক্টের কোনও __str__পদ্ধতি না থাকে তবে __repr__পরিবর্তে এটি ব্যবহৃত হয়। এছাড়াও যেমনটি উল্লেখ করা হয়েছে: এই উদাহরণটি আসলে __str__পদ্ধতিটি প্রিন্ট করে self.xএবং self.y: স্ট্রিং ফর্ম্যাটিং অপারেশনের %rপরিবর্তে ব্যবহার করা উচিত %s(যেহেতু ক্লাসটি সংজ্ঞায়িত করে না __str__, __repr__আসলে যাইহোক ফেরত দেওয়া হয়, তবে এটি একটি বিপরীতমুখী)।
ড্যানিয়েল অ্যান্ডারসন

20

পাইথন ডকুমেন্টেশনে এটি বেশ ভালভাবে ব্যাখ্যা করা হয়েছে :

repr ( অবজেক্ট ): কোনও বস্তুর মুদ্রণযোগ্য উপস্থাপনা সম্বলিত একটি স্ট্রিং ফিরিয়ে দিন। এটি রূপান্তর দ্বারা উত্পন্ন একই মান (বিপরীত উদ্ধৃতি)। সাধারণ ক্রিয়াকলাপ হিসাবে এই ক্রিয়াকলাপটি অ্যাক্সেস করতে সক্ষম হওয়া কখনও কখনও দরকারী। অনেক ধরণের ক্ষেত্রে, এই ফাংশনটি এমন একটি স্ট্রিং ফেরত দেওয়ার চেষ্টা করে যা পাস করার সময় একই মান সহ একটি বস্তু উত্পন্ন করবে eval(), অন্যথায় উপস্থাপনাটি একটি কোণে বন্ধনীতে আবদ্ধ একটি স্ট্রিং যাতে এতে অতিরিক্ত তথ্যের সাথে অবজেক্টের ধরণের নাম যুক্ত থাকে is প্রায়শই বস্তুর নাম এবং ঠিকানা সহ including কোনও শ্রেণিটি কোনও __repr__()পদ্ধতি নির্ধারণ করে এই ফাংশনটি কীভাবে তার দৃষ্টান্তগুলির জন্য ফিরে আসে তা নিয়ন্ত্রণ করতে পারে ।

সুতরাং আপনি এখানে যা দেখছেন তা হ'ল ডিফল্ট বাস্তবায়ন __repr__যা সিরিয়ালাইজেশন এবং ডিবাগিংয়ের জন্য কার্যকর।


5
আমি মনে করি যে
কোনও জিনিসের

ম্যাট্রিক্সফ্রোগ: উভয়ই সত্য, তবে বর্তমান 2.x ডকুমেন্টেশন এখনও এটাকে বলে, যেখানে কোটটি এসেছে।

অনেকগুলি অবজেক্টের জন্য, __repr__ এবং __str__ একই ফাংশন। প্রকৃতপক্ষে, আপনি যদি কেবল __str__ সংজ্ঞায়িত করেন তবে __repr__ কেবলমাত্র __str__ এ কল করতে ডিফল্ট। এটি সত্য নয় যেখানে সর্বাধিক সুস্পষ্ট কেসটি হ'ল তারা: স্ট্রিং: 'স্ট্যাকওভারফ্লো' রিটার্ন দেয় stackoverflowতবে রিপ্র ('স্ট্যাকওভারফ্লো') 'stackoverflow'
ম্যাট্রিক্সফ্রোগ

6
আপনার এটি পিছনের দিকে রয়েছে, __repr__ কখনই __str__ ব্যবহার করে না, তবে বিপরীতটি ঘটতে পারে। Docs.python.org/references/…

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__আর্গুমেন্ট হিসাবে প্রমাণ করার চেষ্টা করেন তবে ফলাফলটি বৈধ হবে না be


1

ক্লাসগুলি সংজ্ঞায়িত করে আমরা যখন নতুন প্রকার তৈরি করি, তখন নতুন ক্লাসগুলি ব্যবহারের সুবিধার্থে আমরা পাইথনের কয়েকটি বৈশিষ্ট্যের সুবিধা নিতে পারি। এই বৈশিষ্ট্যগুলির মধ্যে একটি হ'ল "বিশেষ পদ্ধতি", এটি "যাদু পদ্ধতি" হিসাবেও পরিচিত।

বিশেষ পদ্ধতিগুলির নাম রয়েছে যা শুরু হয় এবং দুটি আন্ডারস্কোর দিয়ে শেষ হয়। আমরা সেগুলি সংজ্ঞায়িত করি, তবে সাধারণত তাদের নাম হিসাবে সরাসরি কল করি না। পরিবর্তে, তারা নির্দিষ্ট পরিস্থিতিতে স্বয়ংক্রিয়ভাবে সম্পাদন করে।

মুদ্রণ বিবৃতি ব্যবহার করে কোনও বস্তুর উদাহরণের মান আউটপুট করতে সক্ষম হওয়া সুবিধাজনক। যখন আমরা এটি করি, আমরা মানটি আউটপুটে কিছু বোধগম্য দ্ব্যর্থহীন বিন্যাসে উপস্থাপন করতে চাই। Repr বিশেষ পদ্ধতি এই ঘটতে ব্যবস্থা ব্যবহার করা যেতে পারে। যদি আমরা এই পদ্ধতিটি সংজ্ঞায়িত করি তবে আমরা স্বয়ংক্রিয়ভাবে কল করতে পারি যখন আমরা কোনও ক্লাসের উদাহরণের মান প্রিন্ট করি তখন আমরা এই পদ্ধতিটি সংজ্ঞায়িত করেছি। এটি উল্লেখ করা উচিত, যদিও, সেখানে একটি স্ট্রিংও রয়েছে বিশেষ পদ্ধতি, একটি অনুরূপ জন্য ব্যবহৃত, কিন্তু না অভিন্ন উদ্দেশ্য, যে প্রাধান্য পেতে পারেন, যদি আমরা এটা সংজ্ঞায়িত করেছেন।

যদি আমরা সংজ্ঞায়িত না করি তবে repr Point3D বর্গ জন্য পদ্ধতি, এবং Point3D একটি দৃষ্টান্ত হিসাবে উপস্থাপনার ক্ষেত্রে 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 প্রতি বর্গ আপনি বাস্তবায়ন জন্য। কোন অজুহাত থাকা উচিত। ক্লাসগুলির জন্য স্ট্রিম প্রয়োগ করুন যা আপনি মনে করেন যে পাঠযোগ্যতা অ-অস্পষ্টতার চেয়ে বেশি গুরুত্বপূর্ণ।

এই লিঙ্কটিটি দেখুন : https://www.pythoncentral.io/hat-is-the-differences-between- str -and- repr -in-python /

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