代码之家  ›  专栏  ›  技术社区  ›  m0j0

关于元组的新手Python问题

  •  5
  • m0j0  · 技术社区  · 17 年前

    我是Python新手,正在使用 cx_Oracle cx_Oracle documentation 他们有这样一个代码示例:

    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
    

    , =

    我知道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
    
    3 回复  |  直到 17 年前
        1
  •  10
  •   ddaa    17 年前
    error, = exc.args
    

    这是一个典型的例子 sequence unpacking .

    我个人喜欢的一种更具可读性的写作方式是:

    [error] = exc.args
    

    理解上一个示例需要两个位:

    1. 当赋值的左侧是名称的递归序列时,右侧的值必须是具有相同长度的序列,并且RHS值的每个项都被赋值给LHS中的相应名称。
    2. python中编写了一个一项元组 (foo,)
        2
  •  5
  •   Matthew Christensen    17 年前

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

    查看第5.3节中的“顺序拆包”。

        3
  •  4
  •   Andrew Beyer    17 年前

    逗号用于解包元组,即它提取元组的单个项,并将其绑定到 error