Новичок Python Вопрос о кортежах - PullRequest
5 голосов
/ 20 ноября 2008

Я новичок в 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'».

Может кто-нибудь указать мне, где это задокументировано? Спасибо!

EDIT:

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

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

Ответы [ 3 ]

10 голосов
/ 20 ноября 2008
error, = exc.args

Это случай последовательности распаковки .

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

[error] = exc.args

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

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

http://www.python.org/doc/2.5.2/tut/node7.html

Ищите «последовательность распаковки» в разделе 5.3.

4 голосов
/ 20 ноября 2008

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

...