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

Python脚本报错:UnboundLocalError: sa_clientId引用前未赋值

解决UnboundLocalError: local variable 'sa_clientId' referenced before assignment错误

问题根源

你的代码里sa_clientId只在if response.text != ''的代码块内被赋值,如果接口返回的response.text是空字符串,这个分支不会执行,sa_clientId就从未被定义,最后执行return sa_clientId时就会触发这个未绑定局部变量的错误。

修复方案

可以从两个方向处理:

方案1:提前给变量赋默认值

在函数开头或者判断分支前,先给sa_clientId设默认值(比如None),确保无论代码走哪个分支,变量都已存在:

def create_service_account(bearer_token, parent_rg_id, rg_id, rg_name, roles):
    
    global sa_db
    # 提前初始化变量,避免未赋值就返回
    sa_clientId = None
    
    print('>> Creating service account for rg %s with rg_id %s' % (rg_name, rg_id))
    print(type(roles), len(roles))
    print(roles)
    print(parent_rg_id)

    url = "https://<snipped>/api/controlplane/" + parent_rg_id + "/serviceaccounts"

    payload = json.dumps({
      "name": "Client %s - %s" % (rg_name, str(roles)),
      "resourceGroups": [
        {
          "resourceGroupId": rg_id,
          "roles": roles
        }
      ]
    })
    headers = {
      'api-version': '1.1',
      'Content-Type': 'application/json',
      'Authorization': 'Bearer ' + bearer_token
    }

    response = requests.request("POST", url, headers=headers, data=payload)

    print(response.text)
    
    if response.text != '':
        sa_infos = json.loads(response.text)
        sa_clientSecret = sa_infos['secret']['value']
        sa_clientId = sa_infos['clientId']
        sa_id = sa_infos['id']
        sa_name = sa_infos['name']
        sa_rg = sa_infos['resourceGroups']

        sa_db[sa_clientId] = {
          'secret': sa_clientSecret,
          'id': sa_id,
          'name': sa_name,
          'resourceGroups': sa_rg
        }


    return sa_clientId

方案2:处理空响应的错误场景

空响应大概率意味着接口调用失败,不如直接在这种情况下抛出异常,明确告知调用者出错了:

def create_service_account(bearer_token, parent_rg_id, rg_id, rg_name, roles):
    
    global sa_db
    
    print('>> Creating service account for rg %s with rg_id %s' % (rg_name, rg_id))
    print(type(roles), len(roles))
    print(roles)
    print(parent_rg_id)

    url = "https://<snipped>/api/controlplane/" + parent_rg_id + "/serviceaccounts"

    payload = json.dumps({
      "name": "Client %s - %s" % (rg_name, str(roles)),
      "resourceGroups": [
        {
          "resourceGroupId": rg_id,
          "roles": roles
        }
      ]
    })
    headers = {
      'api-version': '1.1',
      'Content-Type': 'application/json',
      'Authorization': 'Bearer ' + bearer_token
    }

    response = requests.request("POST", url, headers=headers, data=payload)

    print(response.text)
    
    if response.text == '':
        # 抛出异常,提示接口调用失败
        raise RuntimeError("创建服务账户失败,接口返回空响应")
    
    sa_infos = json.loads(response.text)
    sa_clientSecret = sa_infos['secret']['value']
    sa_clientId = sa_infos['clientId']
    sa_id = sa_infos['id']
    sa_name = sa_infos['name']
    sa_rg = sa_infos['resourceGroups']

    sa_db[sa_clientId] = {
      'secret': sa_clientSecret,
      'id': sa_id,
      'name': sa_name,
      'resourceGroups': sa_rg
    }

    return sa_clientId

额外建议

其实更严谨的做法是检查response的状态码(比如response.status_code == 200),而不是只判断response.text是否为空,这样能更准确地判断接口调用是否成功。

内容的提问来源于stack exchange,提问作者docker_compose

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:25:40