Як друкуючы вынік аб'екта ў іншым выхадзе, чым і вул () і предст ()?

Я тэставаў код на перакладчыка, і я заўважыў некаторы нечаканае паводзіны для sqlite3.Row клас.

Маё разуменне было тое, што друк OBJ заўсёды будзе атрымаць той жа вынік, што і друк вул (аб'ект) , і набраўшы 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?


>>> 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 павінен быць падкласы картэжаў , але я да гэтага часу не разумею, менавіта тое, што адбываецца за кулісамі, якія маглі б прывесці да такіх паводзінаў. Можа хто-небудзь растлумачыць гэта?

Гэта было пратэставана на Python 2.5.1, не ўпэўнены, што калі паводзіны з'яўляецца аднолькавым для ўсіх версій Python.

Не ўпэўнены, ці мае гэта ці не, але row_factory атрыбут для майго Connection быў усталяваны ў становішча sqlite3.Row .

17
@kaloyan - Я нічога не магу знайсці там што адказы на маё пытанне, калі вы можаце, калі ласка, паказаць мне на яго.
дададзена аўтар Andrew Clark, крыніца
Цікавае паводзіны. <�Код> sqlite3.Row не падаецца падклас картэжа, таму я думаю, заява для друку спецыяльных футляры спісаў і/або картэжаў на аснове некаторых іншых крытэрыяў, чым атрыманне ў спадчыну, але я нічога не магу знайсці ў дакументацыі, якая будзе прызнаць, што значна менш, растлумачыць гэта.
дададзена аўтар millimoose, крыніца
А вы паглядзіце на stackoverflow.com/пытанні/1436703/& hellip; перад публікацыяй?
дададзена аўтар ktdrv, крыніца

2 адказы

PySqlite забяспечвае адмысловы роднай кручок для Друк , але ён не выконвае __ магнезіі __ або __ __ вул . Я б сказаў, што гэта крыху прапушчаны шанец, але, па меншай меры, гэта тлумачыць паводзіны вы назіраеце.

See pysqlite source: https://github.com/ghaering/pysqlite/blob/master/src/row.c#L241 And python docs: http://docs.python.org/c-api/typeobj.html#tp_print

11
дададзена
Я звязаны гэтую тэму ў багтрекере pysqlite у: code.google.com/ р/pysqlite/пытанні/дэталі? ID = 4
дададзена аўтар Ondergetekende, крыніца
@CiroSantilli Я абнавіў свой адказ на рахунак для пераходу на GitHub. Бедная функцыянальнасць да гэтага часу не вырашана, хоць
дададзена аўтар Ondergetekende, крыніца
Добрая знаходка! Аказваецца, што SQLite распрацоўнікі пайшлі супраць рэкамендацый, якія, верагодна, чаму гэта не відаць у большай колькасці месцаў. З дакументаў: «Тып ніколі не павінен ажыццяўляць tp_print такім чынам, што вырабляе розную прадукцыю, чым tp_repr або tp_str б» і «не рэкамендуецца вызначыць tp_print, але замест таго, каб спадзявацца на tp_repr і tp_str для друку».
дададзена аўтар Andrew Clark, крыніца
@Ondergetekende спасылка памылка зламаў, зрабіў гэта ў канчатковым выніку дзесьці яшчэ, ці мы будзем адкрываць новы (на bugs.python. орг ?)
дададзена аўтар Ciro Santilli 包子露宪 六四事件 法轮功, крыніца
s = str(tuple(row))

абыходны шлях, калі вы хочаце арыгінальны картэж радковага прадстаўлення.

Гэта карысна, напрыклад, калі вы хочаце, каб увайсці ў шэраг лёгка, як:

logging.debug(tuple(user_row))

Працуе, таму што радкі з'яўляюцца ітэрацыю.

0
дададзена