如何解决Python:带字符串插值的动态json
我创建了一类提供某些云基础架构的功能。
response = self.ecs_client.register_task_definition(
containerDefinitions=[
{
"name": "redis-283C462837EF23AA","image": "redis:3.2.7","cpu": 1,"memory": 512,"essential": True,},...
这是一个很长的json,我只显示开头。
然后,我将代码重构为使用参数,而不是硬编码的哈希,内存和cpu。
response = self.ecs_client.register_task_definition(
containerDefinitions=[
{
"name": f"redis-{git_hash}","cpu": {num_cpu},"memory": {memory_size},...
在此代码之前,我从配置文件中读取了git_hash
,num_cpu
和memory_size
的值。
现在,我还想从文件中读取整个json。
问题是,如果我将{num_cpu}
等保存在文件中,则字符串插值将不起作用。
如何从逻辑中提取json并仍然使用字符串插值或变量?
解决方法
您可以使用<div class="list-services">
<div class='column-service'
v-for='estimation in filteredEstimation'
v-bind:key="estimation.name"
:class="{ focusService }"
@click="focusService = !focusService"
>
<div class="service-name">
{{estimation.name}}
</div>
<div class="service-description">
{{estimation.description}}
</div>
<div class="service-price">
{{estimation.price}}
<span class="price-currency">€</span>
</div>
</div>
</div>
中的// Assuming you are using javascript modules if not just remove the export keyword
// obviously add the needed properties for the object
const globalContext = Object.freeze({}) // freeze object to prevent mutations to it
export const getGlobalContext = () => {
// hiding the global variable behind a getter offers two advantages,it better conveys the message that this object should not mutated by code
// later it enables more customization of context sharing,if for example later you decide to nest contexts,but if your context will get complicated,then doing that through a library should be better option
return globalContext;
}
。
this
class
意见:我认为总体方法是错误的。有一个原因为什么这种方法不如其他方法流行。您可以将配置分为两个文件(1)静态选项列表和(2)紧凑的可变配置,然后将它们组合在代码中。
编辑:您可以创建一个对象,该对象从标准(静态或可变)JSON文件Template
中读取配置。然后使用另一个对象string
行对其进行组合。
这将允许您扩展行为,并在混合中添加例如运行时配置。通过这种方式,JSON文件中的配置不再取决于运行时参数,您可以将系统中的可变内容与静态内容分开。
PS:{
"name": "redis-${git_hash}","image": "redis:3.2.7","cpu": ${num_cpu},"memory": ${memory_size},"essential": true
}
方法仅是解释组合行为的示例;您可以使用其他方法/设计。
from string import Template
import json
if __name__ == '__main__':
data = dict(
num_cpu = 1,memory_size = 1,git_hash = 1
)
with open('test.json','r') as json_file:
content = ''.join(json_file.readlines())
template = Template(content)
configuration = json.loads(template.substitute(data))
print(configuration)
# {'name': 'redis-1','image': 'redis:3.2.7','cpu': 1,'memory': 1,'essential': True}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。