2011-10-27 17 views
17

Tôi đã thử nghiệm một số mã trên trình thông dịch và tôi nhận thấy một số hành vi không mong muốn đối với lớp học sqlite3.Row.Làm cách nào để in kết quả đối tượng ở đầu ra khác với cả str() và repr()?

sự hiểu biết của tôi là print obj sẽ luôn luôn nhận được kết quả tương tự như print str(obj), và gõ obj thành người phiên dịch sẽ nhận được kết quả tương tự như print repr(obj), tuy nhiên đây không phải là trường hợp cho sqlite3.Row:

>>> print row  # the row object prints like a tuple 
(u'string',) 
>>> print str(row) # why wouldn't this match the output from above? 
<sqlite3.Row object at 0xa19a450> 

>>> row    # usually this would be the repr for an object 
(u'string',) 
>>> print repr(row) # but repr(row) is something different as well! 
<sqlite3.Row object at 0xa19a450> 

Tôi nghĩ sqlite3.Row phải là một phân lớp của tuple, nhưng tôi vẫn không hiểu chính xác những gì đang diễn ra đằng sau hậu trường có thể gây ra hành vi này. Bất cứ ai có thể giải thích điều này?

Điều này đã được thử nghiệm trên Python 2.5.1, không chắc chắn liệu hành vi có giống nhau đối với các phiên bản Python khác hay không.

Không chắc chắn điều này có quan trọng hay không, nhưng thuộc tính row_factory cho số Connection của tôi được đặt thành sqlite3.Row.

+0

Bạn đã xem http://stackoverflow.com/questions/1436703/difference-between-str-and-repr-in-python trước khi đăng? – ktdrv

+0

@ kaloyan - Tôi không thể tìm thấy bất kỳ điều gì có câu trả lời cho câu hỏi của tôi, nếu bạn có thể vui lòng chỉ cho tôi. –

+0

Hành vi thú vị. 'sqlite3.Row' dường như không phân lớp tuple, vì vậy tôi đoán là danh sách các trường hợp đặc biệt và/hoặc tuple in dựa trên một số tiêu chí khác so với thừa kế, nhưng tôi không thể tìm thấy bất kỳ điều gì trong tài liệu sẽ thừa nhận, ít giải thích điều này. – millimoose

Trả lời

11

PySqlite cung cấp móc bản địa đặc biệt cho print, nhưng nó không thực hiện __repr__ hoặc __str__. Tôi muốn nói đó là một cơ hội bỏ lỡ, nhưng ít nhất nó giải thích hành vi bạn đang quan sát.

Xem nguồn pysqlite: https://github.com/ghaering/pysqlite/blob/master/src/row.c#L241 Và python tài liệu: http://docs.python.org/c-api/typeobj.html#tp_print

+2

Rất dễ tìm! Có vẻ như các nhà phát triển sqlite đã đi ngược lại các khuyến nghị đó có lẽ là lý do tại sao điều này không được nhìn thấy ở nhiều nơi hơn. Từ các tài liệu: "Một loại không bao giờ nên thực hiện tp_print theo cách tạo ra đầu ra khác với tp_repr hoặc tp_str" và "không nên định nghĩa tp_print, mà thay vào đó dựa vào tp_repr và tp_str để in". –

+3

Tôi đã liên kết chủ đề này trong trình gỡ lỗi của pysqlite: http://code.google.com/p/pysqlite/issues/detail?id=4 – Ondergetekende

+0

@Ondergetekende liên kết lỗi đã bị hỏng, nó có kết thúc ở một nơi khác không, hoặc chúng ta sẽ mở một tài khoản mới (tại http://bugs.python.org/?) –

0
s = str(tuple(row)) 

là một cách giải quyết nếu bạn muốn các đại diện chuỗi tuple gốc.

Nó rất hữu ích ví dụ nếu bạn muốn đăng nhập hàng một cách dễ dàng như trong:

logging.debug(tuple(user_row)) 

trình vì hàng là iterable.

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