【问题标题】:Python : is there an alternate to: "except IndexError:" something lighter?Python:是否有替代:“除了IndexError:”更轻的东西?
【发布时间】:2014-09-30 04:11:43
【问题描述】:

如果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]:

【问题讨论】:

  • 如果你的记录是None,没有输出时,你可以检查None
  • 您使用的是fetchall() 还是fetchone()?您能否展示如何从 mysql 获取数据以及 record 的样子?谢谢。
  • 结果 = db.store_result() 记录 = result.fetch_row()
  • @user3880134 首先需要检查的是,查询是否返回了一些记录。我觉得record 不知何故没有数据,这是实际问题。先检查if record:

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


【解决方案1】:

在一般情况下,如果您想检查一个项目是否存在于列表中,只需检查它是否存在。异常被视为 Pythonic 代码。使用另一种结构进行访问检查可能会降低可读性并且会出现性能问题。

但是,如果您真的对其他东西感兴趣.. 这个怎么样?

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

这是因为空列表 ([]) 在 if 语句中的计算结果为 False

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

【讨论】:

  • if record[0]: 也为我返回“IndexError: tuple index out of range”
  • 结果是“如果记录:”有效。 (遵循从 rrecord[0][0] 中删除一些 [0] 的逻辑)
【解决方案2】:

一个更简单的选择:

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. 遍历光标以获取结果

【讨论】:

    【解决方案3】:

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

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

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

    现在,为列表提供类似的东西会很方便。从列表中获取项目 在某些方面与从字典中获取项目非常相似,但并不完全相同。 Python 做出设计决定,不使用类似的列表方法。

    当然,你可以很容易地自己制作。我有时会在自己的库中使用一个函数 称为“getitem”,它返回一个默认参数;但是它只查找列表的一级, 因为我觉得多层次太极端了,它可能值得使用 具有多个级别的异常。但是,对于一个级别,您可以这样做:

    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
    

    请注意,有一个问题:您不能假设返回 None 意味着没有 项目,如果您的列表本身可能包含 None 值。似乎很明显,但这是一些事情 你必须记住。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      相关资源
      最近更新 更多