0

如果函数在成功时返回一个二值列表或元组,或者在失败时返回 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

4 回答 4

4

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

如果找不到(键,值)对表示某种系统故障,最好抛出异常。如果您的失败并不真正属于任何标准异常,您应该构建自己的新异常类型。

最好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'
于 2011-03-10T21:38:34.923 回答
3

这属于 Python 的“请求宽恕比许可更容易”政策。我避免在你的函数中捕获 TypeError ,以防出现其他无法预料的问题。

data = get_key_value()
try:
   key, value = data
except TypeError:
   #handle the failure somehow
   key, value = 'ERROR', 'ERROR'
于 2011-03-10T21:30:25.707 回答
1

我认为没有一种惯用的方法可以做到这一点——尤其是因为以这种方式运行的函数本身就是一种惯用的方法。如果你必须这样做,我建议你简单地利用你的 2 元素列表或元组是一个“真实”而不是“虚假”值的事实(这不是 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 的可能性,那么您就有可能以这种方式掩盖真正的错误。

于 2011-03-10T21:30:29.787 回答
1

您遇到了问题,因为您混合了返回类型。仅仅因为你可以并不意味着你应该。

尽管我在这里同意其他人的观点,即例外是一种合适的方法,但这可能取决于您是否希望在大多数情况下找到有效的键和值。如果是这样,请使用异常(类似KeyError)来指示函数失败。但是,如果您希望它以高速率失败,您可能不希望异常开销。在这种情况下,返回类似[None, None]from 的内容get_key_value,然后您的调用代码将如下所示:

key, value = get_key_value()
if key:
    # take action
else:
    # handle the error appropriately
于 2011-03-10T21:48:12.283 回答