能否将Python文件中的常量导入JSON并转换为对象?
当然可行,但得先澄清一个关键点:JSON本身是纯静态的数据格式,完全不支持引入模块、执行代码这类动态操作——所以你没法直接在info.json里写C.val1这种Python表达式。不过我们可以通过Python代码来间接实现你的需求:先把abc.py里的常量提取出来,写入JSON文件,之后再把JSON转回Python对象。
具体实现步骤
1. 从abc.py中提取常量
假设你的abc.py内容是:
# abc.py val1 = 10 val2 = 20
我们可以用Python的importlib模块导入这个模块,然后筛选出我们定义的常量(过滤掉模块自带的内置属性):
import importlib import json # 导入abc模块 abc_module = importlib.import_module('abc') # 提取自定义常量:排除以下划线开头的内置属性 constants = { key: value for key, value in vars(abc_module).items() if not key.startswith('_') }
2. 将常量写入info.json
接下来把提取到的常量按照你想要的键名映射(比如val1对应c1,val2对应c2),然后写入JSON文件:
# 按照需求映射键名 json_content = { "c1": constants['val1'], "c2": constants['val2'] } # 写入JSON文件,indent参数让格式更美观 with open('info.json', 'w') as f: json.dump(json_content, f, indent=4)
执行这段代码后,info.json的内容会变成:
{ "c1": 10, "c2": 20 }
3. 将JSON转换为Python对象
之后如果需要把JSON内容转回可直接访问的Python对象,可以用types.SimpleNamespace来实现:
import json from types import SimpleNamespace # 读取JSON文件内容 with open('info.json', 'r') as f: json_data = json.load(f) # 转换为可通过属性访问的对象 const_obj = SimpleNamespace(**json_data) # 现在可以像访问对象属性一样使用 print(const_obj.c1) # 输出: 10 print(const_obj.c2) # 输出: 20
进阶技巧:批量映射键名
如果abc.py里有大量类似valX的常量,不想手动一个个映射,可以用字符串替换来批量生成键名:
# 自动将valX映射为cX json_content = { key.replace('val', 'c'): value for key, value in constants.items() if key.startswith('val') }
内容的提问来源于stack exchange,提问作者Kumar
相关产品推荐
相关产品推荐

