2008-11-19 9 views
5

Я новичок в Python, и я работаю над написанием кода базы данных с помощью модуля cx_Oracle. В cx_Oracle documentation у них есть пример кода, как это:Newbie Python Вопрос о кортежах

Мой вопрос связан с тем, где создается объект «ошибка». Что делает «, =»? Я попытался найти документацию на Python, и поисковые системы не работают очень хорошо, когда вы ищете операторов. :-)

Я знаю, что exc.args является одноэлементным кортежем, но я просто не понимаю синтаксис «, =». Если я удалю запятую, я получу сообщение об ошибке «AttributeError: 'tuple' object has no attribute 'code'».

Может кто-нибудь указать мне, где это задокументировано? Благодаря!

EDIT:

Это работает без распаковки кортежа:

import sys 
import cx_Oracle 

connection = cx_Oracle.Connection("user/[email protected]") 
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 

ответ

9
error, = exc.args 

Это случай sequence unpacking.

Более читаемый способ написать то же самое, и стиль, который я лично одобряю, это:

[error] = exc.args 

Есть два бита, необходимые для понимания предыдущего примера:

  1. Когда левая рука сторона присваивания - это рекурсивная последовательность имен, значение правой стороны должно быть последовательностью с одинаковой длиной, а каждому элементу значения RHS присваивается соответствующее имя в LHS.
  2. Кортеж с одним предметом в питоне написан (foo,). В большинстве контекстов круглые скобки могут быть опущены. В частности, их можно опустить рядом с оператором присваивания.
4

Запятая служит для распаковки кортежа, то есть извлекает единственный элемент кортежа и связывает его с error. Без запятой вы бы привязывали сам кортеж, а не его содержимое.

Смежные вопросы