我似乎无法获取要作为字典加载的字符串(通过 JSON)并将字符串中嵌入的字典项转换为字典中的正确值。
用例:我正在编写一个应用程序,其中文本文件将用于调用 Python 代码,特别是函数。一切都很好,直到我尝试将函数中定义的变量作为字典项。
举个例子,我之前有一个文本文件,它会逐行调用一个函数:
someFunction(variable1 = 11, someListVar = [1,2,3] ...)
等等
然后我对其进行了更改,以便我的文本文件具有:
someFunction(variable1 = someDict["someKey"], someListVar = [anotherDict["anotherKey"],...] )
等等
作为一个最小化的例子:
#this all works fine
import json
someDict = {"One":"Good"}
x = {"someKey": someDict["One"]}
# convert into JSON string:
y = json.dumps(x)
print(y)
>> {"someKey": "Good"}
print(type(y))
>><class 'str'>
JSON 字符串的行为也符合预期:
z = json.loads(y) #this can get reloaded as a dictionary
print(z)
>> {'someKey': 'Good'}
print(type(z))
>> <class 'dict'>
但是,另一方面,如果我尝试以字符串开始,似乎无论我如何格式化字符串,我都无法让它引入字典值:
xString = '{"someKey": "someDict[\'One\']"}' #regardless of escape characters
yNew = json.loads(xString)
print(yNew)
>>{'someKey': "someDict['One']"}
print(yNew["someKey"])
>>someDict['One']
最简单的解决方案当然是 eval():
print(eval(yNew["someKey"]))
#>>Good
但是,当然,这是一个不太理想的解决方案。
FWIW 我尝试了 xString 变量的不同转义字符格式,但无济于事。我想我可以制作某种解析器,但这看起来很不优雅,特别是考虑到这就是 JSON 模块应该做的事情。
我认为你应该考虑一下你设计项目的方式。 JSON 文件不应该包含变量(变量在服务器/客户端上可以有不同的值)。
但是,您可以使用模板来实现您想要做的事情。一个使用 jinja2 的简单示例:
import json
from jinja2 import Environment
env = Environment()
xString = '{"someKey": "{{ someDict["One"] }}"}'
template = env.from_string(xString)
someDict = {"One":"Good"}
print(template.render(someDict=someDict))
输出:
{"someKey": "Good"}