Hiểu hàm repr () trong Python


152

repr(): đánh giá đại diện chuỗi của một đối tượng (có thể "eval ()", nghĩa là nó là một đại diện chuỗi đánh giá đối tượng Python)

Nói cách khác:

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

Câu hỏi:

  1. Tại sao tôi nhận được báo giá kép khi tôi làm repr(x)? (Tôi không nhận được chúng khi tôi làm str(x))
  2. Tại sao tôi nhận được 'foo'khi tôi làm eval("'foo'")và không x đó là đối tượng?

Câu trả lời:


166
>>> x = 'foo'
>>> x
'foo'

Vì vậy, tên xđược gắn vào 'foo'chuỗi. Khi bạn gọi ví dụ repr(x), thông dịch viên đặt 'foo'thay vì xvà sau đó gọi repr('foo').

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

reprthực sự gọi một phương thức ma thuật __repr__của x, cung cấp cho chuỗi chứa biểu diễn của giá trị 'foo'được gán x. Vì vậy, nó trở lại 'foo'bên trong chuỗi ""kết quả "'foo'". Ý tưởng reprlà đưa ra một chuỗi chứa một loạt các ký hiệu mà chúng ta có thể nhập vào trình thông dịch và nhận cùng một giá trị được gửi làm đối số repr.

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

Khi chúng tôi gọi eval("'foo'"), nó giống như chúng tôi gõ 'foo'vào trình thông dịch. Đó là khi chúng ta trực tiếp nhập nội dung của chuỗi bên ngoài ""trong trình thông dịch.

>>> eval('foo')

Traceback (most recent call last):
  File "<pyshell#5>", 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ó giống như chúng ta gõ foovào trình thông dịch. Nhưng không có foobiến có sẵn và một ngoại lệ được nêu ra.

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

strchỉ là biểu diễn chuỗi của đối tượng (hãy nhớ, xbiến tham chiếu 'foo'), vì vậy hàm này trả về chuỗi.

>>> str(5)
'5'

Chuỗi đại diện của số nguyên 5'5'.

>>> str('foo')
'foo'

Và đại diện chuỗi của chuỗi 'foo'là cùng một chuỗi 'foo'.


Bạn cũng có thể cho chúng tôi biết một số trường hợp sử dụng khi người ta nên sử dụng chức năng repr. Tôi không thể hiểu điều đó
paraurar gaurav

14

Các phản hồi bạn nhận được về trình thông dịch tương tác reprcũng sử dụng . Khi bạn gõ một biểu thức (hãy để nó expr), về cơ bản trình thông dịch sẽ làm result = expr; if result is not None: print repr(result). Vì vậy, dòng thứ hai trong ví dụ của bạn định dạng chuỗi foothành biểu diễn bạn muốn ( 'foo'). Và sau đó, trình thông dịch tạo ra ý reprnghĩa của điều đó , để lại cho bạn dấu ngoặc kép.

Tại sao khi tôi kết hợp% r với trích dẫn kép và trích dẫn đơn thoát ra và in chúng ra, nó sẽ in nó theo cách tôi viết nó trong tệp .py của mình nhưng không phải là cách tôi muốn xem?

Tôi không chắc chắn những gì bạn đang hỏi ở đây. Các văn bản single ' and double " quotes, khi chạy qua repr, bao gồm các lối thoát cho một loại trích dẫn. Tất nhiên là có, nếu không nó sẽ không phải là một chuỗi ký tự hợp lệ theo quy tắc Python. Đó chính xác là những gì bạn yêu cầu bằng cách gọi repr.

Cũng lưu ý rằng sự eval(repr(x)) == xtương tự không có nghĩa là theo nghĩa đen. Đó là một xấp xỉ và đúng với hầu hết các loại tích hợp (tất cả?), Nhưng điều chính là bạn có một ý tưởng khá tốt về loại và "giá trị" logic từ việc tìm kiếm reprđầu ra.


2
Ban đầu, nó thực sự đã có nghĩa là phải theo nghĩa đen: của mỗi giá trị reprhoặc nên là cái gì đó có thể được chuyển sang eval(hoặc sao chép và dán vào mã nguồn của bạn) để tạo ra một giá trị như nhau, hoặc cái gì đó sẽ nâng cao một Lỗi Cú pháp khi bạn cố gắng đó (thường các <…>phong cách sản xuất bởi object.__repr__). Điều đó đã dần dần được giảm xuống trong những năm qua, và đến 2,7 và 3.x, điều đó đúng "đối với nhiều loại", và có những trường hợp ngoại lệ ngay cả trong stdlib (ví dụ: một namedtupleloại được tạo như một địa phương sẽ cung cấp cho bạn một reprkhả năng ' t eval), nhưng đó là ý tưởng ban đầu.
abarnert

7

str () được sử dụng để tạo đầu ra cho người dùng cuối trong khi repr () được sử dụng để phát triển gỡ lỗi. Và nó đại diện cho chính thức của đối tượng.

Thí dụ:

>>> import datetime
>>> today = datetime.datetime.now()
>>> str(today)
'2018-04-08 18:00:15.178404'
>>> repr(today)
'datetime.datetime(2018, 4, 8, 18, 3, 21, 167886)'

Từ đầu ra, chúng ta thấy rằng repr () hiển thị đại diện chính thức của đối tượng ngày.


3

1) Kết quả repr('foo')chuỗi 'foo' . Trong trình bao Python của bạn, kết quả của biểu thức cũng được biểu thị dưới dạng biểu diễn, vì vậy về cơ bản bạn đang nhìn thấy repr(repr('foo')).

2) evaltính kết quả của một biểu thức. Kết quả luôn là một giá trị (chẳng hạn như một số, một chuỗi hoặc một đối tượng). Nhiều biến có thể tham chiếu đến cùng một giá trị, như trong:

x = 'foo'
y = x

x và y bây giờ đề cập đến cùng một giá trị.

3) Tôi không biết bạn có ý gì ở đây. Bạn có thể đăng một ví dụ, và những gì bạn muốn xem?


1

Khi bạn nói

foo = 'bar'
baz(foo)

bạn không chuyển foođến bazchức năng. foochỉ là một tên được sử dụng để đại diện cho một giá trị, trong trường hợp này 'bar'và giá trị đó được truyền cho bazhàm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.