Python函数if-else嵌套逻辑异常:传入'tom'触发错误问题排查
问题
我定义了如下Python函数:
def fun(name=None): data = [['tom'], ['nick'], ['juli']] name0 = data[0] # tom name1 = data[1] # nick name2 = data[2] # juli if name is not None: if name=='tom': Name=name0 if name=='nick': Name=name1 if name=='juli': Name=name2 if name is None: print('Reading all the names') Name=data else: raise Exception('arguments cannot be empty. Either pass one single name or None') return Name
调用fun('tom')时触发如下异常:
--------------------------------------------------------------------------- Exception Traceback (most recent call last) Cell In[28], line 26 23 raise Exception('arguments cannot be empty. Either pass one single name or None') 24 return Name ---> 26 fun('tom') Cell In[28], line 23, in fun(name) 21 Name=data 22 else: ---> 23 raise Exception('arguments cannot be empty. Either pass one single name or None') 24 return Name Exception: arguments cannot be empty. Either pass one single name or None
可见if分支被跳过,程序执行else分支触发异常。此前类似逻辑脚本可正常运行,请问我哪里出错了?
错误分析与修复
核心问题
你代码里的第二个if name is None判断逻辑完全覆盖了第一个分支的处理:
- 当传入
name='tom'时,第一个if name is not None分支确实会执行,给Name赋值为['tom'] - 但紧接着的第二个
if name is None判断,因为name不为None,所以直接进入else分支抛出异常,完全忽略了前面已经完成的赋值操作
修复方案
方案一:用字典优化逻辑(推荐)
用字典做名字映射,既能简化代码,又能清晰区分合法参数的处理逻辑:
def fun(name=None): data = [['tom'], ['nick'], ['juli']] name_map = { 'tom': data[0], 'nick': data[1], 'juli': data[2] } if name is None: print('Reading all the names') return data if name in name_map: return name_map[name] else: raise Exception('Invalid name. Please pass one of "tom", "nick", "juli" or None')
方案二:保留原结构修复
如果想保留原有变量定义方式,只需调整第二个判断的逻辑,只在Name未被正确赋值时抛出异常:
def fun(name=None): data = [['tom'], ['nick'], ['juli']] name0 = data[0] # tom name1 = data[1] # nick name2 = data[2] # juli Name = None # 先初始化变量 if name is not None: if name=='tom': Name=name0 elif name=='nick': # 改用elif提升效率 Name=name1 elif name=='juli': Name=name2 if name is None: print('Reading all the names') Name=data elif Name is None: raise Exception('Invalid name. Either pass one single valid name or None') return Name
内容的提问来源于stack exchange,提问作者Sayantan4796
相关产品推荐
相关产品推荐

