Вопрос для новичка в Python о кортежах
Вопрос
Я новичок в Python и работаю над написанием кода базы данных, используя cx_Oracle
модуль.в документация cx_Oracle у них есть такой пример кода:
import sys
import cx_Oracle
connection = cx_Oracle.Connection("user/pw@tns")
cursor = connection.cursor()
try:
cursor.execute("select 1 / 0 from dual")
except cx_Oracle.DatabaseError, exc:
error, = exc.args
print >> sys.stderr, "Oracle-Error-Code:", error.code
print >> sys.stderr, "Oracle-Error-Message:", error.message
Мой вопрос связан с тем, где создается объект «ошибка».Что это ", =
" делать?Я пробовал искать документацию по Python, но поисковые системы работают не очень хорошо при поиске операторов.:-)
Я знаю, что exc.args - это одноэлементный кортеж, но я просто не понимаю ", =
"Синтаксис.Если я уберу запятую, я получу сообщение об ошибке: "AttributeError: 'tuple' object has no attribute 'code'
".
Может кто-нибудь указать мне, где это задокументировано?Спасибо!
РЕДАКТИРОВАТЬ:
Это работает без распаковки кортежа:
import sys
import cx_Oracle
connection = cx_Oracle.Connection("user/pw@tns")
cursor = connection.cursor()
try:
cursor.execute("select 1 / 0 from dual")
except cx_Oracle.DatabaseError, exc:
print >> sys.stderr, "Oracle-Error-Code:", exc.args[0].code
print >> sys.stderr, "Oracle-Error-Message:", exc.args[0].message
Решение
error, = exc.args
Это случай распаковка последовательности.
Более читабельный способ написать то же самое и стиль, который лично мне нравится:
[error] = exc.args
Для понимания предыдущего примера необходимы два бита:
- Когда левая часть присваивания представляет собой рекурсивную последовательность имен, значение правой части должно быть последовательностью одинаковой длины, и каждый элемент значения RHS присваивается соответствующему имени в LHS.
- Написан кортеж из одного элемента в Python
(foo,)
.В большинстве контекстов скобки можно опустить.В частности, их можно опустить рядом с оператором присваивания.
Другие советы
http://www.python.org/doc/2.5.2/tut/node7.html
Найдите «распаковку последовательности» в разделе 5.3.
Запятая служит для распаковки кортежа, т.е.он извлекает единственный элемент кортежа и привязывает его к error
.Без запятой вы бы связали сам кортеж, а не его содержимое.