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