Domanda

Sono nuovo di Python e sto lavorando alla scrittura di un codice di database utilizzando il modulo cx_Oracle . Nella cx_Oracle documentazione hanno un esempio di codice come questo:

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

La mia domanda ha a che fare con dove " errore " l'oggetto è stato creato. Cosa significa " , = " fare? Ho provato a cercare la documentazione di Python e i motori di ricerca non funzionano molto bene quando cerchi operatori. : -)

So che exc.args è una tupla singleton, ma non capisco il " , = " sintassi. Se rimuovo la virgola, ricevo il messaggio di errore, " AttributeError: l'oggetto 'tuple' non ha attributo 'code' " ;.

Qualcuno può indicarmi dove è documentato? Grazie!

Modifica

Funziona senza dover decomprimere la tupla:

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
È stato utile?

Soluzione

error, = exc.args

Questo è un caso di disimballaggio della sequenza .

Un modo più leggibile per scrivere lo stesso, e lo stile che preferisco personalmente, è:

[error] = exc.args

Sono necessari due bit per comprendere l'esempio precedente:

  1. Quando il lato sinistro di un'assegnazione è una sequenza ricorsiva di nomi, il valore del lato destro deve essere una sequenza con la stessa lunghezza e ogni elemento del valore RHS è assegnato al nome corrispondente nell'LHS .
  2. Una tupla di un oggetto in python è scritta (foo,) . Nella maggior parte dei contesti, la parentesi può essere omessa. In particolare, possono essere omessi accanto all'operatore di assegnazione.

Altri suggerimenti

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

Cerca " sequenza disimballaggio " nella sezione 5.3.

La virgola serve per decomprimere la tupla, ovvero estrae il singolo elemento della tupla e lo lega a errore . Senza la virgola, legheresti la tupla stessa, piuttosto che il suo contenuto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top