python:是否可以从json加载值并自动将其键与现有变量匹配以分配值?
我是python新手,听说它有一些有趣的元编程特性,但我对这些特性一无所知 我不确定这是否存在,但是否可以加载json文件并搜索与现有脚本中的变量匹配的键,如果存在匹配项,则分配它们 此外,如果我进行了这些赋值,是否可以检测到加载脚本(本例中为配置脚本)包含json文件没有的变量名?在本例中,我会将这些新变量名添加到json文件并保存值,以便在下次运行时加载 例如,我想做一些事情,在下面的代码中,附加到执行脚本的变量列表将被放入一个列表中,然后可以使用该列表匹配json文件中的键,还可以在执行脚本中为变量分配新值python:是否可以从json加载值并自动将其键与现有变量匹配以分配值?,python,json,automation,metaprogramming,Python,Json,Automation,Metaprogramming,我是python新手,听说它有一些有趣的元编程特性,但我对这些特性一无所知 我不确定这是否存在,但是否可以加载json文件并搜索与现有脚本中的变量匹配的键,如果存在匹配项,则分配它们 此外,如果我进行了这些赋值,是否可以检测到加载脚本(本例中为配置脚本)包含json文件没有的变量名?在本例中,我会将这些新变量名添加到json文件并保存值,以便在下次运行时加载 例如,我想做一些事情,在下面的代码中,附加到执行脚本的变量列表将被放入一个列表中,然后可以使用该列表匹配json文件中的键,还可以在执行脚
config.py
MAX_LIMIT = 100
FOO = 'test'
BAR = 'other test'
def get_variable_names():
return list_of_variables_in_config.py
def load_config():
vars = get_variable_names()
with open('config.json') as data_file:
config = json.load(config_file)
for k in config.keys():
if k in vars:
vars[k] = config[k]
for v in vars:
if not v in config.keys():
config[v] = vars[v]
write_config(config)
def print_vars():
print('MAX_LIMIT = ', MAX_LIMIT)
print('FOO = ', FOO)
print('BAR = ', BAR)
运行load config后的输出:
MAX_LIMIT = 23
FOO = modified var
BAR = other modified var
这可能吗
提前感谢这里有一个模块,可以像导入python模块一样导入json文件: 但即使是作者也将其称为“可憎” 正如其他人指出的,您可以使用
locals()
获取当前的局部变量,并将其与JSON数据进行比较。尽管文档中声明不应修改locals()
,但通常可以不修改。尽管在您的情况下,如果在函数中更改它,locals()
将不起作用
不过,您似乎在谈论全局/模块级变量。因此,您可以使用globals()
函数,该函数可以写入
def load_config():
with open('config.json') as data_file:
config = json.load(config_file)
for k in config.keys():
if k in globals():
globals()[k] = config[k]
但是请注意,这可能非常危险-特别是如果您不能信任配置文件中的内容…那么有一个模块,可以用来导入json文件,就像导入python模块一样: 但即使是作者也将其称为“可憎” 正如其他人指出的,您可以使用
locals()
获取当前的局部变量,并将其与JSON数据进行比较。尽管文档中声明不应修改locals()
,但通常可以不修改。尽管在您的情况下,如果在函数中更改它,locals()
将不起作用
不过,您似乎在谈论全局/模块级变量。因此,您可以使用globals()
函数,该函数可以写入
def load_config():
with open('config.json') as data_file:
config = json.load(config_file)
for k in config.keys():
if k in globals():
globals()[k] = config[k]
但是请注意,这可能相当危险-特别是如果您不能信任配置文件中的内容…您可以检查
locals()
中是否存在密钥,如果存在,请将其替换。..hmm,在python locals()文档中说:“请注意,本词典的内容不应修改;更改可能不会影响解释器使用的本地变量和自由变量的值。“因此,这表明我不应该在这里赋值?嗯,是的,您可能不应该做您想做的事情,但是globals()
可能是一个“更好”的选择。另外,在测试本地变量()的使用情况时,在尝试打印变量名称时,我遇到了一个运行时错误:字典在迭代期间更改了大小,这表明for循环中的任何新变量也将成为此字典的一部分。如果我在循环井中加载和分配变量,这似乎是个问题,您可以.copy()
字典,并迭代该副本。您可以检查locals()
中是否存在键,如果存在,请将其替换。..hmm,在python locals()文档中说:“注意,不应修改此字典的内容;更改可能不会影响解释器使用的本地变量和自由变量的值。“因此,这表明我不应该在这里赋值?嗯,是的,您可能不应该做您想做的事情,但是globals()
可能是一个“更好”的选择。另外,在测试本地变量()的使用情况时,在尝试打印变量名称时,我遇到了一个运行时错误:字典在迭代期间更改了大小,这表明for循环中的任何新变量也将成为此字典的一部分。如果我在循环井中加载和分配变量,这似乎是个问题,您可以.copy()
查看字典,然后反复阅读该副本。谢谢!事实上,我确实使用了上面一些评论中所述的globals()。这不是供个人艺术项目以外的公共用途,也不会通过web或远程访问访问,因此我认为对于我的用例来说,它是相当安全的。我在这里写的(仍然需要一些编辑和更改以获得最佳实践)谢谢!事实上,我确实使用了上面一些评论中所述的globals()。这不是用于个人艺术项目以外的公共用途,并且不能通过web或远程访问访问,所以我认为对于我的用例来说,它是相当安全的。我写在这里(仍需要进行一些编辑和更改以获得最佳实践)