python:是否可以从json加载值并自动将其键与现有变量匹配以分配值?

python:是否可以从json加载值并自动将其键与现有变量匹配以分配值?,python,json,automation,metaprogramming,Python,Json,Automation,Metaprogramming,我是python新手,听说它有一些有趣的元编程特性,但我对这些特性一无所知 我不确定这是否存在,但是否可以加载json文件并搜索与现有脚本中的变量匹配的键,如果存在匹配项,则分配它们 此外,如果我进行了这些赋值,是否可以检测到加载脚本(本例中为配置脚本)包含json文件没有的变量名?在本例中,我会将这些新变量名添加到json文件并保存值,以便在下次运行时加载 例如,我想做一些事情,在下面的代码中,附加到执行脚本的变量列表将被放入一个列表中,然后可以使用该列表匹配json文件中的键,还可以在执行脚

我是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或远程访问访问,所以我认为对于我的用例来说,它是相当安全的。我写在这里(仍需要进行一些编辑和更改以获得最佳实践)