Computer >> Máy Tính >  >> Lập trình >> Python

str () so với repr () trong Python?

Cả hai phương thức str () và repr () trong python đều được sử dụng để biểu diễn chuỗi của một chuỗi. Mặc dù dường như cả hai đều phục vụ cùng một con chó con, nhưng có một chút khác biệt giữa chúng.

Bạn đã bao giờ để ý điều gì sẽ xảy ra khi bạn gọi một hàm tích hợp sẵn trong python str (x) trong đó x là bất kỳ đối tượng nào bạn muốn chưa? Giá trị trả về của str (x) phụ thuộc vào hai phương thức:__str__ là lựa chọn mặc định và __repr__ là dự phòng.

Trước tiên, hãy xem tài liệu về trăn nói gì về chúng -

>>> 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.

Bây giờ chúng ta hãy thử hiểu hai phương pháp này bằng một vài ví dụ

>>> 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'"

Các giá trị trả về của repr () và str () giống nhau đối với giá trị số nguyên, nhưng có sự khác biệt giữa các giá trị trả về cho chuỗi - một là chính thức và một là không chính thức.

Bây giờ nếu bạn xem tài liệu python chính thức - __str__ được sử dụng để tìm biểu diễn chuỗi "không chính thức" (có thể đọc) của một đối tượng trong khi __repr__ được sử dụng để tìm biểu diễn chuỗi "chính thức" của một đối tượng.

Sự khác biệt giữa các biểu diễn chính thức và không chính thức là việc triển khai mặc định __repr__ cho một giá trị str có thể được gọi như một đối số để eval và giá trị trả về sẽ là một đối tượng chuỗi hợp lệ. Hàm này (repr ()) nhận một chuỗi và đánh giá nội dung của nó dưới dạng mã python.

Vì vậy, khi chúng ta truyền "'Python'" cho nó, nó sẽ hoạt động. Tuy nhiên, ‘Python’ dẫn đến một lỗi khiến nó được hiểu là biến Python, tất nhiên là không được xác định. Dưới đây là mã để hiểu nó -

>>> x = "Python"
>>> repr(x)
"'Python'"
>>> x1 = eval (repr(x))
>>> x == x1
True

Vì vậy, nếu chúng tôi cố gắng gọi giá trị trả về của __str__ làm đối số để đánh giá, thì nó không thành công.

>>> 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

Một ví dụ khác để chứng minh sự khác biệt giữa hai điều này là -

>>> 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)'

Trong đầu ra ở trên, str (now) tính toán một chuỗi chứa giá trị của now trong khi repr (now) lại trả về mã python cần thiết để xây dựng lại đối tượng now của chúng ta.

Sự khác biệt chính

str ()
repr ()
Làm cho đối tượng có thể đọc được
Mã bắt buộc tái tạo đối tượng
Tạo đầu ra cho người dùng cuối
Tạo đầu ra cho nhà phát triển

Các điểm trên cần được xem xét khi viết __str__ và __repr__ cho các lớp học của bạn.