Bản in Python có sử dụng str hay repr không?

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ù cả hai dường như phục vụ cùng một con nhộng, 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 hàm str(x) tích hợp sẵn của python trong đó x là bất kỳ đối tượng nào bạn muốn chưa? . __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 python 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ờ, hãy cố gắng hiểu hai phương thức 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'"

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 giá trị chính thức và giá trị kia là không chính thức

Bây giờ, nếu bạn xem tài liệu chính thức về python - __str__ được sử dụng để tìm biểu diễn chuỗi "không chính thức" (có thể đọc đượ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 làm đối số cho eval và giá trị trả về sẽ là một đối tượng chuỗi hợp lệ. Hàm này (repr()) lấy 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 tôi chuyển "'Python'" cho nó, công việc của nó. Tuy nhiên, 'Python' dẫn đến lỗi vì nó được hiểu là biến Python, tất nhiên là không 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ố cho eval, thì nó không thành công

>>> y = "Python"
>>> str(y)
'Python'
>>> y1 = eval(str(y))
Traceback (most recent call last):
File "", line 1, in 
y1 = eval(str(y))
File "", line 1, in 
NameError: name 'Python' is not defined

Một ví dụ khác để chứng minh sự khác biệt giữa hai 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)'

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

Python nói “__repr__” được sử dụng để lấy biểu diễn chuỗi của đối tượng trong khi __str__” được sử dụng để tìm biểu diễn chuỗi “không chính thức” của một đối tượng. Nhưng, tại sao chúng ta cần hai đại diện khác nhau?

Giả sử chúng ta đang làm việc với mã. Chúng tôi đã giới thiệu một lớp có tên là “Animal” và chúng tôi đã xây dựng một đối tượng “a” cho nó

Bây giờ, khi chương trình này chạy, nó sẽ trả về một cái gì đó không thể đọc được như thế này

<__main__.Animal object at 0x11024fa00>

Cách giải quyết chung cho vấn đề này là chúng ta gọi trực tiếp các thuộc tính của lớp và nhận kết quả là “Dog” và “Pomeranian” trong trường hợp của chúng ta

print(a.animal)
print(a.name)

Nhưng trên thực tế, có một quy ước trong Python xử lý tất cả đoạn mã “in” ở trên mà chúng tôi đã viết. Tôi muốn giải thích cách nó hoạt động và cách __repr__ và __str__ hoạt động. Đây cũng là một trong những câu hỏi được hỏi nhiều nhất trong các cuộc phỏng vấn. Vậy nên hãy chờ trong giây lát

__str__

Hãy học cùng lớp Động vật để làm mọi thứ dễ dàng hơn. Vì vậy, tôi vừa thêm một phương thức str dunder trong lớp

Về cơ bản những gì phương thức dunder của tôi làm ở đây là bất cứ khi nào chúng ta gọi lớp, nó sẽ trả về cho chúng ta một đầu ra chuỗi “A Pomeranian Dog” thay vì id đối tượng trong bộ nhớ

Tuy nhiên, nếu bạn chỉ kiểm tra đối tượng, bạn vẫn sẽ nhận được địa chỉ bộ nhớ

Vì vậy, kiểm tra đối tượng Animal vẫn cung cấp địa chỉ bộ nhớ nhưng khi chúng tôi in đối tượng, chúng tôi nhận được một kết quả khác dựa trên phương thức __str__

Vì vậy, để khắc phục điều này, bạn cũng có thể làm một cái gì đó như thế này

Nó cũng sẽ trả lại cho bạn đầu ra chuỗi. Về cơ bản, bạn đang buộc một đối tượng chuyển đổi thành chuỗi. Và, nó sẽ gọi phương thức dunder str để làm điều đó

__repr__

Chúng tôi vừa biết về __str__. Bây giờ, cái thứ hai được gọi là __repr__. Hãy hiểu nó khác với __str__ như thế nào

Đoạn mã dưới đây sẽ giúp bạn hiểu toàn bộ kịch bản của __str__ và __repr__ xảy ra bí mật

Khi chúng ta vừa kiểm tra đối tượng, __repr__ được gọi trong khi khi chúng ta sử dụng phương thức in, __str__ được gọi

Trong một ví dụ khác, tôi đã gọi cả hai phương thức “str” và “repr” trên một đối tượng datetime

Sử dụng str đã chuyển đổi đối tượng thành chuỗi và làm cho nó có thể đọc được. Mặc dù repr phải rõ ràng và có nhiều ý nghĩa hơn cho việc gỡ lỗi và sử dụng nội bộ

Phần kết luận

__str__ hoặc str() được sử dụng để tạo đầu ra mà con người có thể đọc được phải dành cho người dùng cuối. Nhưng, repr() hoặc __repr__ phải phục vụ mục đích gỡ lỗi và phát triển

Sự khác biệt giữa str() và repr() trong Python là gì?

Bây giờ, nếu bạn xem tài liệu chính thức về python - __str__ được sử dụng để tìm biểu diễn chuỗi "không chính thức" (có thể đọc đượ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

Bản in lại trong Python là gì?

Hàm repr() Python trả về một biểu diễn có thể in được của một đối tượng trong Python .

Là repr() một Python được xây dựng

Định nghĩa. Hàm tích hợp sẵn repr() của Python trả về biểu diễn có thể in được của đối tượng đã chỉ định dưới dạng một chuỗi. Hàm repr() trong Python trả về một biểu diễn có thể in được của đối tượng bằng cách chuyển đổi đối tượng đó thành một chuỗi.