【问题标题】:Is it posible to return on the line with exception?是否可以异常返回上线?
【发布时间】:2014-10-17 10:39:59
【问题描述】:

我的代码如下所示:

try:
    a = form['a']
except KeyError:
    pass
try:
    b = form['b']
except KeyError:
    pass
try:
    c = form['c']
except KeyError:
    pass
try:
    d = form['d']
except KeyError:
    pass

是否可以这样做:

try:
    a = form['a']
    b = form['b']
    c = form['c']
    d = form['d']
except KeyError:
    somekeyword

因此,如果表单中没有键 'a' 仍然有效,则尝试查找键 'b' 等等

更新: 对不起这是我的错。我需要保留所有价值观,而不仅仅是其中之一。 所以我需要关键字或类似的东西来帮助我在异常引发后继续尝试阻止。

【问题讨论】:

  • 是的,你当然可以这样做。
  • 可以使用user=form.get('a'),当key不存在时默认返回None...
  • 可以这样做,但它的工作方式会有所不同——无论user = form['a']是否失败,前者仍会尝试user = form['b'],而后者则不会。跨度>

标签: python python-2.7 exception


【解决方案1】:

如果form 是字典,您也可以使用.get(key, [default]) 语法:

>>> form = {'d':5}
>>> form.get('a', form.get('b', form.get('c', form['d'])))
5

您可以使用一些迭代器使函数调用惰性

>>> from itertools import dropwhile
>>> it = (form.get(k) for k in ['a', 'b', 'c', 'd'])
>>> next(dropwhile(lambda val: val is None, it))
5

编辑:如果您需要全部四个:

>>> a, b, c, d = map(form.get, ['a', 'b', 'c', 'd'])
>>> a, b, c, d
(None, None, None, 5)

【讨论】:

  • iter 是内置函数,请勿将其用作变量名。
  • @BurhanKhalid 非常真实!修好了!
  • 请注意,您可以从列表中解压缩,因此a, b, c, d = map(form.get, ['a', 'b', 'c', 'd']) 也可以。如果我们保证键是单个字符,可以缩短为a, b, c, d = map(form.get, 'abcd')
【解决方案2】:

您可以简单地这样做,假设表单支持完整的 dict 语义,并且 None 实际上是表单的有效值:

sentinel = object()
user = sentinel
for key in "abcd":
    user = form.get(key, user)
if user is sentinel: # I don't know if None is a va
   whatever-you-mean-with-somekeyword

【讨论】:

  • Python 支持for...else 构造,这样你就不必像这样搞乱哨兵了。
  • 您能否详细说明这在哪里有帮助? AFAIK 如果循环中有中断,它只是关于运行代码。这对这里有什么帮助?
  • 如果值范围足够大,哨兵本身有时会出现问题。当一个合适的值出现时,早期打破通常也是可取的,即使算法不再是 1:1 相同。并且可以说使用显式构造是更 Pythonic 的事情。
  • @progo sentinel 是一个新对象,所以它不能出现在form 中。
  • @chepner:哦,是的......我忽略了我承认以前没有使用过的细节。
猜你喜欢
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 2012-11-14
  • 2019-02-25
  • 2013-10-26
  • 2011-04-10
  • 2013-11-11
  • 1970-01-01
相关资源
最近更新 更多