Python如何跨函数调用其他方法内的变量完成JSON构建?
问题原因
PersonID、PhoneID这类在函数内部定义的变量属于函数局部作用域,仅在对应函数运行时的内部上下文生效,外部的jsonAPI函数无法直接读取这类局部变量。你实现的两个Builder函数本身已经返回了封装好所有字段的字典,不需要单独提取每个局部变量使用。
修复方案
直接在jsonAPI函数内调用两个Builder函数拿到返回的字典对象,再将两个字典的字段合并到目标JSON结构中即可,同时补全原代码缺失的模块导入、入口调用、字符编码兼容逻辑:
import json # 若使用Flask框架的jsonify方法保留此导入,否则可删除 from flask import jsonify def PersonBuilder(): PersonID = 1 PersonName = "Behzat" PersonSurname = "Çözer" PersonCompany = "EGM" PersonTitle = "Başkomiser" return { 'PersonID': PersonID, 'PersonName': PersonName, 'PersonSurname': PersonSurname, 'PersonCompany': PersonCompany, 'PersonTitle': PersonTitle } def PhoneNumberBuilder(): PhoneID = 1 PhoneCountry = "Turkey" PhoneOperator = "TR XXXXXX" PhoneNumber = "+905XXXXXXXX" return { 'PhoneID': PhoneID, 'PhoneCountry': PhoneCountry, 'PhoneOperator': PhoneOperator, 'PhoneNumber': PhoneNumber } def jsonAPI(): # 调用构造函数拿到预定义的字典数据 person_info = PersonBuilder() phone_info = PhoneNumberBuilder() # 合并两个字典到目标JSON结构 myjson3 = { "Person": {**person_info, **phone_info} } # 用with语句自动管理文件关闭,指定utf8编码避免乱码 with open("myfile.json", "w", encoding="utf-8") as out_file: # ensure_ascii=False保证非英文字符正常写入,不被转义 json.dump(myjson3, out_file, indent=6, ensure_ascii=False) return jsonify(myjson3) if __name__ == "__main__": # 入口处需要主动调用函数才会执行逻辑 jsonAPI()
代码说明
{**person_info, **phone_info}是Python 3.5+原生支持的字典合并语法,会把两个字典的所有键值对平铺合并到新字典中,正好匹配你要把人员信息、手机号信息放在同一个Person节点下的需求。- 新增的
encoding="utf-8"和ensure_ascii=False参数,是为了避免土耳其语这类非ASCII字符在写入文件时被转义成乱码。 - 用
with open()的上下文管理器写法操作文件,不需要手动调用close()方法,能避免文件资源泄露问题。
内容的提问来源于stack exchange,提问作者Behzat Ç.
相关产品推荐
相关产品推荐

