Как печать объекта может привести к выводу, отличному от str () и repr ()? - PullRequest
17 голосов
/ 27 октября 2011

Я тестировал некоторый код на интерпретаторе и заметил неожиданное поведение для класса sqlite3.Row.

Насколько я понимаю, print obj всегда будет иметь тот же результат, что и print str(obj), а ввод obj в интерпретаторе даст тот же результат, что и print repr(obj), однако это не относится к 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>

Я думаю, что sqlite3.Row должен быть подклассом tuple, но я до сих пор не понимаю точно, что происходит за кулисами, которые могут вызвать такое поведение. Кто-нибудь может объяснить это?

Это было проверено на Python 2.5.1, не уверен, что поведение аналогично для других версий Python.

Не уверен, имеет ли это значение, но атрибут row_factory для моего Connection был установлен на sqlite3.Row.

Ответы [ 2 ]

12 голосов
/ 27 октября 2011

PySqlite предоставляет специальный собственный хук для print, но он не реализует __repr__ или __str__. Я бы сказал, что это немного упущенный шанс, но, по крайней мере, он объясняет поведение, которое вы наблюдаете.

См. Источник pysqlite: https://github.com/ghaering/pysqlite/blob/master/src/row.c#L241 И документы Python: http://docs.python.org/c-api/typeobj.html#tp_print

0 голосов
s = str(tuple(row))

- это обходной путь, если требуется исходное представление строки кортежа.

Это полезно, например, если вы хотите легко зарегистрировать строку, как в:

logging.debug(tuple(user_row))

Работает, потому что строки повторяемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...