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
相关产品推荐
相关产品推荐

