Как включить функции в скрипте из того, что указано в конфигурационном файле? - PullRequest
0 голосов
/ 14 июня 2019

У меня есть следующий файл 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))   

Как написано в коде, я хотел бы вызывать функции, только если естьустановите значение True в файле конфигурации JSON.Это правильный путь?Упрощают ли существующие инструменты этот подход, или мне приходится писать каждый случай вручную?

Ответы [ 4 ]

3 голосов
/ 14 июня 2019

Вы можете заменить цикл for вызовом 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 соответствуют существующей функции

2 голосов
/ 14 июня 2019

Вы можете сделать что-то вроде этого:

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])

Если вы в порядке с лямбдами, вы можете даже использовать:

defs = {
    'add1' : lambda n: n+1,
    'add2' : lambda n: n+2,
    'add3' : lambda n: n+3
}
1 голос
/ 14 июня 2019

@ У Sayse был хороший метод, хотя я бы изменил строку суммы, чтобы нам не нужно было добавлять 0, если значение равно false.

            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 поддерживают одну или другую версию. Результаты идентичны.

Обратите внимание, что вы доверяете данным для указания функций, вызываемых вашей программой. Неверные или вредоносные данные могут привести к неопределенному и вредному поведению, поэтому вы можете проверить ключи, чтобы убедиться, что все они задают одну из функций, которые вы собираетесь использовать таким образом.

1 голос
/ 14 июня 2019

Вы должны использовать 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   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...