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_hashnum_cpumemory_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}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...