You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:26:26