2011-08-18 27 views
6

Trong trình thông dịch, bạn chỉ có thể viết tên của một đối tượng, ví dụ: một danh sách a = [1, 2, 3, u"hellö"] tại dấu nhắc phiên dịch như thế này:Sự khác biệt giữa `>>> some_object` và` >>> in some_object` trong trình thông dịch Python là gì?

>>> a 
[1, 2, 3, u'hell\xf6'] 

hoặc bạn có thể làm:

>>> print a 
[1, 2, 3, u'hell\xf6'] 

mà dường như tương đương cho các danh sách. Hiện tại tôi đang làm việc với hdf5 để quản lý một số dữ liệu và tôi nhận ra rằng có một sự khác biệt giữa hai phương pháp được đề cập ở trên. Đưa ra:

with tables.openFile("tutorial.h5", mode = "w", title = "Some Title") as h5file: 
    group = h5file.createGroup("/", 'node', 'Node information') 
    tables.table = h5file.createTable(group, 'readout', Node, "Readout example") 

Kết quả của

print h5file 

khác với

>>> h5file 

Vì vậy, tôi đã tự hỏi nếu ai đó có thể giải thích sự khác biệt về hành vi Python trong hai trường hợp này?

Trả lời

8

Nhập một đối tượng vào các lệnh gọi thiết bị đầu cuối __repr__(), để trình bày chi tiết đối tượng bạn đang in (rõ ràng). Khi bạn nói một cái gì đó để 'in', bạn đang gọi __str__() và do đó yêu cầu một cái gì đó con người có thể đọc được.

Alex Martelli đã giải thích tuyệt vời here. Các phản ứng khác trong luồng cũng có thể làm sáng tỏ sự khác biệt.

Ví dụ: hãy xem các đối tượng ngày giờ.

>>> import datetime 
>>> now = datetime.datetime.now() 

Hãy so sánh ...

>>> now 
Out: datetime.datetime(2011, 8, 18, 15, 10, 29, 827606) 

để ...

>>> print now 
Out: 2011-08-18 15:10:29.827606 

Hy vọng mà làm cho nó rõ ràng hơn một chút!

1

Lệnh in luôn gọi phương thức x.__str__() trong khi (chỉ trong interpeter tương tác) chỉ cần gọi một biến đối tượng x.__repr__() phương thức được gọi.

>>> '\x02agh' 
'\x02agh' 
>>> print '\x02agh' 
'agh' 
+0

Tài liệu này ở đâu? Tôi không thể tìm thấy nó. – jtbandes

+0

@jtbandes Không biết ở đâu, nhưng bạn có thể tự mình thử nghiệm. PS: Ai đó có thể pleaso định dạng mã nội tuyến phải không? Nó không hoạt động trên thiết bị di động. Cảm ơn ! –

+0

Tất nhiên tôi có thể kiểm tra nó, đó không phải là những gì tôi hỏi :) – jtbandes

2

Trình thông dịch tương tác sẽ in kết quả của mỗi biểu thức được nhập vào. (Vì báo cáo không đánh giá, nhưng thay vì thực thi, hành vi in ​​này không áp dụng cho các tuyên bố như bản thân print, vòng lặp, v.v.)

Bằng chứng là thông dịch viên tương tác được Niklas Rosenstein sử dụng (sử dụng 2,6 phiên dịch):

>>> class Foo: 
... def __repr__(self): 
...  return 'repr Foo' 
... def __str__(self): 
...  return 'str Foo' 
... 
>>> x = Foo() 
>>> x 
repr Foo 
>>> print x 
str Foo 

Vì vậy, trong khi tuyên bố print có thể không cần thiết trong các thông dịch viên tương tác (trừ khi bạn cần str và không repr), người phiên dịch không tương tác không làm điều này. Việc đặt mã trên vào một tệp và chạy tệp sẽ dẫn đến không có gì được in.

+0

Có, x sẽ được in, bởi vì có một bản in;) –

+0

Ha, thật vui. Tôi đã chỉnh sửa câu trả lời để bao gồm câu lệnh 'print x' để hiển thị rằng một câu lệnh sử dụng' str' và 'repr' khác và quên sửa đổi đoạn cuối cùng. – wberry

0

Nhìn vào tài liệu Python tại địa chỉ: http://docs.python.org/reference/datamodel.html#object.repr

đối tượng. repr (tự)

Called by the repr() built-in function and by string conversions 

(đảo ngược dấu ngoặc kép) để tính toán chuỗi đại diện “chính thức” của một đối tượng . Nếu có thể, điều này sẽ giống như một biểu thức Python hợp lệ có thể được sử dụng để tạo lại một đối tượng có cùng giá trị (được đưa ra một môi trường thích hợp). Nếu điều này là không thể, một chuỗi của biểu mẫu < ... một số mô tả hữu ích ...> phải được trả lại. Giá trị trả lại phải là một đối tượng chuỗi. Nếu một lớp định nghĩa repr() nhưng không str(), sau đó repr() cũng được sử dụng khi một đại diện chuỗi “không chính thức” của trường của lớp đó là yêu cầu.

This is typically used for debugging, so it is important that the 

đại diện thông tin phong phú và rõ ràng.

đối tượng. str (tự)

Called by the str() built-in function and by the print statement 

để tính toán “không chính thức” chuỗi đại diện của một đối tượng. Điều này khác với repr() ở chỗ nó không phải là một biểu thức Python hợp lệ: một đại diện thuận tiện hơn hoặc súc tích có thể được sử dụng để thay thế. Giá trị trả về phải là một đối tượng chuỗi.

Ví dụ:

>>> class A(): 
... def __repr__(self): return "repr!" 
... def __str__(self): return "str!" 
... 
>>> a = A() 
>>> a 
repr! 
>>> print(a) 
str! 
>>> class B(): 
... def __repr__(self): return "repr!" 
... 
>>> class C(): 
... def __str__(self): return "str!" 
... 
>>> b = B() 
>>> b 
repr! 
>>> print(b) 
repr! 
>>> c = C() 
>>> c 
<__main__.C object at 0x7f7162efb590> 
>>> print(c) 
str! 

chức năng Print in mỗi đối số console __str__. Giống như print(str(obj)).

Nhưng trong bảng điều khiển tương tác, giá trị trả về của hàm in là __repr__. Và nếu không thể sử dụng __str__, thay vào đó, __repr__ có thể được sử dụng.

Lý tưởng nhất, __repr__ có nghĩa là, chúng ta chỉ nên sử dụng đại diện đó để tái tạo đối tượng đó. Nó không nên giống hệt nhau giữa các lớp khác nhau, hoặc đối tượng đại diện cho các giá trị khác nhau, Ví dụ: datetime.time:

Nhưng __str__ (những gì chúng tôi nhận được từ str(obj)) có vẻ tốt đẹp, bởi vì chúng tôi hiển thị cho người dùng.

>>> a = datetime.time(16, 42, 3) 
>>> repr(a) 
'datetime.time(16, 42, 3)' 
>>> str(a) 
'16:42:03' #We dont know what it is could be just print: 
>>> print("'16:42:03'") 
'16:42:03' 

Và, xin lỗi vì tiếng Anh xấu :).

0

print(variable) tương đương với print(str(variable))

trong khi

variable tương đương với print(repr(variable))

Rõ ràng, __repr____str__ phương pháp của đối tượng h5file tạo ra kết quả khác nhau.

Các vấn đề liên quan