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风格的做法。@progosentinel
是一个新对象,因此它不能以形式出现。
@chepner:哦,是的。。。我忽略了我承认以前从未使用过的细节。是一个内置函数,不要将其用作变量名。@BurhanKhalid非常正确!修好了!注意,您可以从列表中解包,因此a,b,c,d=map(form.get,['a','b','c','d'])
也可以工作。如果我们保证键是单字符,可以缩短为a,b,c,d=map(form.get,'abcd')