Python:有一个替代:"除了IndexError:"更轻的东西?

时间:2014-08-07 03:37:56

标签: python python-3.x python-2.6

如果mysql没有输出......

if record[0][0]:

将返回错误

 IndexError: tuple index out of range

我知道解决此问题的唯一解决方案是:

try:
    if record[0][0]:
        # Do stuff
except IndexError:
    pass

但这看起来像一个非常重的包装脚本

仅查明是否

 record[0][0]

没有数据。 (没有价值)

是否有更轻松的东西可以做,比如..

if record[0][0] = ""

更新:

这是我的MYSQL代码:

a = _mysql.escape_string(a)
db=b()
db.query("select * from b where a='" + a + "' limit 1")
result = db.store_result()

record = result.fetch_row()

更新

证明了有效的方法:

 if record:

而不是

if record[0]:

if record[0][0]:

3 个答案:

答案 0 :(得分:2)

在一般情况下,如果要检查列表中是否存在项目,只需检查它是否存在。例外被认为是Pythonic代码。使用另一种构造进行访问检查可能性较差,并且存在性能问题。

但是,如果你真的对别的东西感兴趣......那怎么样?

>>> if record[0]:
...     field = record[0][0]

这是有效的,因为空列表([])在False语句中评估为if

>>> record = [[]]
>>> if record[0]:             # returns an empty list, e.g. []
...     field = record[0][0]  # is not executed

答案 1 :(得分:1)

更简单的替代方案:

import MySQLdb

conn = MySQLdb.connect(passwd="sekret",db="foo")
cur = conn.cursor()

cur.execute("select * from b where a=%s limit 1", (a,))

for result in cur:
   print(result)

请注意更改:

  1. 使用MySQLdb,而不是基础_mysql* API
  2. 不要将变量连接到SQL查询字符串中,这将导致SQL注入。
  3. 迭代光标以获得结果

答案 2 :(得分:0)

在Python中,有一种方法可以从字典中获取默认值,但不能从列表中获取默认值。例如。在一个字典中:

x = mydict.get('key')如果没有'key',#x将为None

(您还可以提供不同的默认值作为get()方法的第二个参数)

现在,为列表提供类似的东西会很方便。从列表中获取项目 在某种程度上非常类似于从字典中获取项目,但不完全相同。蟒蛇 做出了一个设计决定,没有类似的列表方法。

当然,你可以很容易地制作自己的。我有时在自己的库中使用一个函数 名为'getitem',返回默认arg;但它只查找列表的一个级别, 因为我觉得多个级别太多的角落情况,它可能值得使用 多个级别的例外。但是,你可以做到一个级别:

def getitem(seq, index, default=None):
    """Get item from a `seq` at `index`, return default if index out of range."""
    try               : return seq[index]
    except IndexError : return default

请注意,有一个问题:你不能假设没有回来意味着没有 item,如果您的列表本身可能包含None值。看起来很明显,但那是件好事 你必须记住。

您可以轻松扩展此功能以接受多个索引并处理多个索引 列表的级别,但是你可能会问:我怎么知道哪个级别有 IndexError?