如果函数在成功时返回一个二值列表或元组,或者在失败时返回 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()
如果函数在成功时返回一个二值列表或元组,或者在失败时返回 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()
将@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'
这属于 Python 的“请求宽恕比许可更容易”政策。我避免在你的函数中捕获 TypeError ,以防出现其他无法预料的问题。
data = get_key_value()
try:
key, value = data
except TypeError:
#handle the failure somehow
key, value = 'ERROR', 'ERROR'
我认为没有一种惯用的方法可以做到这一点——尤其是因为以这种方式运行的函数本身就是一种惯用的方法。如果你必须这样做,我建议你简单地利用你的 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 的可能性,那么您就有可能以这种方式掩盖真正的错误。
您遇到了问题,因为您混合了返回类型。仅仅因为你可以并不意味着你应该。
尽管我在这里同意其他人的观点,即例外是一种合适的方法,但这可能取决于您是否希望在大多数情况下找到有效的键和值。如果是这样,请使用异常(类似KeyError
)来指示函数失败。但是,如果您希望它以高速率失败,您可能不希望异常开销。在这种情况下,返回类似[None, None]
from 的内容get_key_value
,然后您的调用代码将如下所示:
key, value = get_key_value()
if key:
# take action
else:
# handle the error appropriately