如何从配置文件中指定的内容启用脚本中的功能?

时间:2019-06-14 11:40:22

标签: python json configuration

我有以下JSON文件:

{
    "add1":true,
    "add2":false,
    "add3":true
}

以及以下Python程序:

def add1(n): return n+1
def add2(n): return n+2
def add3(n): return n+3

def score(n):
    with open('file.json', 'r') as f:
        conf = json.load(f)
        for key, value in conf.items()
            if value == True:
                # add1 and add3 calls only because they're set to True
                return (add1(n) + add3(n))   

如代码中所写,仅在配置JSON文件中将True设置为True时,我才想调用函数。这是正确的进行方式吗?现有工具是否可以简化这种方法,还是我必须手动编写每种情况?

4 个答案:

答案 0 :(得分:3)

您可以通过调用eval

替换for循环
def score(n):
    with open('file.json', 'r') as file:
        conf = json.load(file)
        return sum(eval(f"{k}({n})") if v else 0 for k, v in conf.items())

这假定您json中的所有条目都映射到现有函数

答案 1 :(得分:2)

您可以执行以下操作:

import json

def add1(n): return n+1
def add2(n): return n+2
def add3(n): return n+3

defs = {
    'add1' : add1,
    'add2' : add2,
    'add3' : add3
}

def score(n):
   with open('file.json', 'r') as f:
       conf = json.load(f)
       return sum(function(n) for name, function in defs.items() if conf[name])

如果您对lambdas没问题,甚至可以使用:

defs = {
    'add1' : lambda n: n+1,
    'add2' : lambda n: n+2,
    'add3' : lambda n: n+3
}

答案 2 :(得分:1)

您应使用eval:https://docs.python.org/3/library/functions.html#eval

def score(n):
   with open('file.json', 'r') as f:
       conf = json.load(f)
       sum = 0
       for key, value in conf.items():
           if value == True:
               sum += eval('{}({})'.format(key, n))
       return sum   

答案 3 :(得分:1)

@Sayse有一个很好的方法,尽管我会更改总和行,以便当值为false时我们不需要加0。

            return sum(eval(f"{key}({n})") for key, value in conf.items() if value)

另一种调用由字符串命名的函数的方法是

            return sum(globals()[k](n) for k,v in conf.items() if v)

我不确定Python的最佳实践是否支持一个版本或另一个版本。结果是相同的。

请注意,您信任数据以指定程序调用的功能。不正确或恶意的数据可能会导致不确定的行为和有害的行为,因此您可能需要检查键,以确保它们都指定了您打算以此方式使用的功能之一。