Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

str() vs repr() ใน Python?


ทั้งเมธอด str() และ repr() ใน python ใช้สำหรับการแสดงสตริงของสตริง แม้ว่าทั้งสองจะดูเหมือนเป็นสุนัขตัวเดียวกัน แต่ก็มีความแตกต่างกันเล็กน้อย

คุณเคยสังเกตไหมว่าเกิดอะไรขึ้นเมื่อคุณเรียกใช้ฟังก์ชันในตัวของ python str(x) โดยที่ x คือวัตถุที่คุณต้องการ? ค่าส่งคืนของ str(x) ขึ้นอยู่กับสองวิธี:__str__ เป็นตัวเลือกเริ่มต้นและ __repr__ เป็นทางเลือกสำรอง

มาดูกันก่อนว่า python docs พูดถึงมันอย่างไร -

>>> 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__ ใช้เพื่อค้นหาการแสดงสตริง "อย่างเป็นทางการ" ของวัตถุ

ความแตกต่างระหว่างการแสดงแบบเป็นทางการและไม่เป็นทางการคือ การใช้งานเริ่มต้นของ __repr__ สำหรับค่า str สามารถเรียกเป็นอาร์กิวเมนต์ของ 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 "<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) จะคำนวณสตริงที่มีค่าของ now ในขณะที่ repr (ตอนนี้) ส่งคืนโค้ด python ที่จำเป็นในการสร้างอ็อบเจกต์ now ของเราอีกครั้ง

ความแตกต่างที่สำคัญ

str()
repr()
ทำให้วัตถุอ่านได้
โค้ดที่จำเป็นซึ่งทำซ้ำ object
สร้างเอาต์พุตให้กับผู้ใช้ปลายทาง
สร้างเอาต์พุตสำหรับนักพัฒนา

ต้องพิจารณาคะแนนด้านบนเมื่อเขียน __str__ และ __repr__ สำหรับชั้นเรียนของคุณ