Novato Python Questão sobre tuplas
Pergunta
Eu sou novo para Python, e eu estou trabalhando em escrever algum código de banco de dados usando o módulo cx_Oracle
. No href="http://cx-oracle.sourceforge.net/html/module.html" rel="nofollow noreferrer"> documentação eles têm um exemplo de código como este:
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
A minha pergunta tem a ver com o local onde o objeto "erro" é criado. O que faz o ", =
" fazer? Eu tentei procurar documentação Python, e os motores de busca não funcionam muito bem quando você está à procura de operadores. : -)
Eu sei que os exc.args é uma tupla Singleton, mas eu só não entendo a sintaxe ", =
". Se eu remover a vírgula, eu recebo a mensagem de erro "AttributeError: 'tuple' object has no attribute 'code'
".
Pode alguém me aponte para onde isso está documentado? Obrigado!
EDIT:
Isso funciona sem ter que descompactar o tuple:
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
Solução
error, = exc.args
Este é um caso de sequcia de desempacotamento .
A forma mais legível para escrever o mesmo, e o estilo que eu favorecer pessoalmente, é:
[error] = exc.args
Existem dois bits necessária para entender o exemplo anterior:
- Quando o lado esquerdo de uma atribuição é uma sequência recursiva de nomes, o valor do lado direito deve ser uma seqüência com o mesmo comprimento, e cada item do valor RHS é atribuído ao nome correspondente nos LHS .
- Uma tupla de um item no python é escrita
(foo,)
. Na maioria dos contextos, os parênteses podem ser omitidos. Em particular, eles podem ser omitidos ao lado do operador de atribuição.
Outras dicas
http://www.python.org/doc /2.5.2/tut/node7.html
Procure "seqüência de descompactação" na secção 5.3.
A vírgula serve para descompactar o tuplo, isto é, que extrai o produto único do tuplo, e liga-o à error
. Sem a vírgula, você ligaria a própria tupla, ao invés de seu conteúdo.