我有以下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时,我才想调用函数。这是正确的进行方式吗?现有工具是否可以简化这种方法,还是我必须手动编写每种情况?
答案 0 :(得分:3)
您可以通过调用eval
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的最佳实践是否支持一个版本或另一个版本。结果是相同的。
请注意,您信任数据以指定程序调用的功能。不正确或恶意的数据可能会导致不确定的行为和有害的行为,因此您可能需要检查键,以确保它们都指定了您打算以此方式使用的功能之一。