Python 有可能在线路上异常返回吗?

Python 有可能在线路上异常返回吗?,python,python-2.7,exception,Python,Python 2.7,Exception,我有一个如下代码: 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']

我有一个如下代码:

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
有可能这样做吗:

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”,以此类推

UPD: 对不起,我的错。我需要保留所有的价值观,而不仅仅是其中一个。
因此,我需要关键字或类似的东西来帮助我在异常引发后继续使用try block。

如果
form
是一个字典,您也可以使用语法:

通过使用一些迭代器,可以使函数调用变为惰性:

>>> 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)

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

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

是的,你当然可以这样做。你可以使用
user=form.get('a')
,当密钥不存在时,它默认返回
None
。你可以这样做,但它的工作方式会有所不同-无论
user=form['a']
是否失败,前者仍会尝试
user=form['b']
,而后者不支持。Python支持
for…else
构造,这样您就不必像这样干扰哨兵。您能详细说明一下这在哪里有帮助吗?好吧,如果循环中有中断,那么只需要运行代码。这有什么帮助呢?如果值范围足够大,哨兵本身有时会有问题。即使算法不再是1:1,当出现合适的值时,提前中断也是可取的。可以说,使用显式构造是一种更具python风格的做法。@progo
sentinel
是一个新对象,因此它不能以
形式出现。
@chepner:哦,是的。。。我忽略了我承认以前从未使用过的细节。是一个内置函数,不要将其用作变量名。@BurhanKhalid非常正确!修好了!注意,您可以从列表中解包,因此
a,b,c,d=map(form.get,['a','b','c','d'])
也可以工作。如果我们保证键是单字符,可以缩短为
a,b,c,d=map(form.get,'abcd')