ทั้งเมธอด 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__ สำหรับชั้นเรียนของคุณ