Thứ Tư, 20 tháng 3, 2013

Hiểu về hàm repr() trong Python

cú pháp: repr(object)
Trả về một string chứa đại diện có thể in được (printable representation) của đối tượng.  Kết quả trả về có cùng giá trị thu được qua những lần chuyển đổi (reverse quotes). Nó thỉnh thoảng hữu ích để có thể truy nhập đến operation này như là một hàm thông thường. Đối với nhiều dạng, hàm này có thể cố gắng lấy về một string giống như ta thực hiện hàm eval() cho string đó. Nếu không đại diện  được đóng trong các angle brackets  chứa tên của kiểu đối tượng cùng với những thông tin thêm về đối tượng đó như là: địa chỉ và tên. Một class có thể điều khiển những gì mà hàm này trả về cho mỗi instance của nó qua việc định nghĩa __repr()__ method.

Chúng ta cùng đi vào một vài ví dụ để hiểu rõ hơn về hàm này.
Tôi có
>>>  x = 'foo' (1)
Thực hiện hàm repr():
>>> repr(x) (2)
Kết quả trả về:
"'foo'"
Tới đây có hai câu hỏi được đặt ra đó là:
1. Tại sao trong kết quả trả về lại xuất hiện dấu nháy kép ("" "")? Trong khi sử dụng hàm str() tôi không thấy?
2. Điều gì xảy ra khi ta sử dụng hàm eval() với kết quả vừa nhận, tức là eval("''foo")

Ta sẽ trả lời các câu hỏi trên sau khi tiếp cận một ví dụ sau đây:
Tôi có
>>>  x = 'foo'
sau đó
>>> x
tôi thu được
'foo'
Ta thấy kết quả khác so với ví dụ phía trên, một cặp dấu nháy kép đúng không.
Quay trở lại ví dụ trên, tại dòng (1) ta thực hiện gán giá trị 'foo' cho biến x, khi ta gọi hàm repr(x) tại dòng (2)   thì trình thông dịch sẽ thay thế x bởi 'foo ' và sau đó gọi hàm repr('foo')

>>> repr(x)
"'foo'"

>>> x.__repr__()
"'foo'"

repr thực sự gọi một magic method __repr__ của đối tượng x, có thể xem xét hàm repr() thực ra cũng chỉ là quá trình "function" hóa một phương thức trong đối tượng, thực sự thì trong hoàn cảnh này thì phương thức hay đối tượng cũng không thực sự khác nhau. Cả phương thức hay đối tượng đều trả về một string chứa đại diện cho giá trị 'foo' được gán cho biến x. Vì vậy nó trả lại một 'foo' nằm bên trong string ("""") và kết quả là "'foo'" như chúng ta thấy. Ý tưởng của repr là đưa ra một string chứa hàng loạt các biểu tượng (symbol) những gì chúng ta có thể gõ (type) trong trình thông dịch và có cùng giá trị với đầu vào của hàm repr.


>>> eval("'foo'")
'foo'

khi chúng ta gọi eval("'foo'") nó cũng giống như ta đánh 'foo' trong trinh thông dịch


>>> eval('foo')
Traceback (most recent call last):
  File "<pyshell#83>", line 1, in <module>
    eval('foo')
  File "<string>", line 1, in <module>
NameError: name 'foo' is not defined

Nếu chúng ta gọi eval('foo') nó đồng nghĩa với việc chúng ta gõ foo trong trinh biên dịch và lỗi xảy ra bởi vì không giá trị foo nào có sắn hay nói cách khác là ta chưa tạo ra biến foo.


>>> str(x)
'foo'
>>> x.__str__()
'foo'

str chỉ là một biểu diễn string của đối tượng, với lẽ đó nó chỉ xuất ra kết quả là string
Một vài ví dụ

>>> x.__str__()
'foo'
>>> str(5)
'5'
>>> str('foo')
'foo'








Không có nhận xét nào:

Đăng nhận xét