5

我是 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
4

3 回答 3

10
error, = exc.args

这是一个序列解包的情况。

一种更易读的写法,也是我个人喜欢的风格,是:

[error] = exc.args

理解前面的示例需要两个位:

  1. 当赋值的左边是一个递归的名字序列时,右边的值必须是一个长度相同的序列,RHS值的每一项都赋值给LHS中对应的名字。
  2. 在 python 中编写了一个单项元组(foo,)。在大多数情况下,括号可以省略。特别是,它们可以在赋值运算符旁边省略。
于 2008-11-19T22:51:00.380 回答
5

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

在第 5.3 节中查找“序列解包”。

于 2008-11-19T22:40:42.303 回答
4

逗号用于解包元组,即它提取元组的单个项目,并将其绑定到error. 如果没有逗号,您将绑定元组本身,而不是其内容。

于 2008-11-19T22:49:00.120 回答