Python惯用的解包赋值或False

时间:2011-03-10 21:25:46

标签: python iterable-unpacking

如果函数在成功时返回两个值列表或元组,或者在失败时返回False,如何在将检查False时将返回列表解压缩为两个变量?

def get_key_value():
  if (cond != True):
    return False
  return [val1, val2]

# Call it
# How can I also check for False while unpacking?
key, value = get_key_value()

4 个答案:

答案 0 :(得分:4)

将@Felix Kling的精彩评论转换为答案。

如果无法找到(键,值)对表示某种系统故障,最好抛出异常。如果您的失败不属于任何standard exceptions,那么您应该构建一个属于您自己的新异常类型。

cond != True最好写成not cond。如果没有必要,最好不要创建列表。

class DataNotFound(Exception): pass

def get_key_value():
  if not cond:
    raise DataNotFound("Couldn't find it!")
  return val1, val2

try:
    key,value = get_key_value()
except DataNotFound:
    #handle the failure somehow
    key, value = 'ERROR', 'ERROR'

答案 1 :(得分:3)

这属于Python的"Easier to Ask for Forgiveness than Permission"政策。我避免在你的函数中捕获TypeError,以防出现其他一些无法预料的问题。

data = get_key_value()
try:
   key, value = data
except TypeError:
   #handle the failure somehow
   key, value = 'ERROR', 'ERROR'

答案 2 :(得分:1)

我不认为这是一种惯用的方法 - 尤其是因为行为方式的函数本身就是单一的。如果你必须这样做,我建议你只是利用你的2元素列表或元组是一个“truthy”而不是“falsy”值的事实(这不是Python术语,但它很有用):

pair_or_false = get_key_value()
if pair:
    key,value = val
else:
    # handle failure in whatever way

显而易见的替代方案是将未找到的案例视为例外:

try:
    key,value = get_key_value()
except TypeError:
    # deal with not-found case

但是如果除了不成功的解包之外的任何其他东西都可能引发TypeError,那么你就冒着掩盖真正错误的风险。

答案 3 :(得分:1)

您遇到了问题,因为您正在混合返回类型。只是因为你不能意味着你应该这样做。

虽然我同意这里的其他人认为例外是一种适当的方式,但这可能取决于你是否希望找到一个有效的密钥&大部分时间都很重要。如果是这样,请使用异常(类似KeyError)来指示函数失败。但是,如果您希望它以高速率失败,您可能不希望出现异常开销。在这种情况下,请从[None, None]返回get_key_value之类的内容,然后您的调用代码如下:

key, value = get_key_value()
if key:
    # take action
else:
    # handle the error appropriately