Лучшая практика для создания сложных диктов с множеством формул - PullRequest
0 голосов
/ 29 мая 2018

Я работаю над требованием, которое должно принимать несколько диктов в качестве входных аргументов и преобразовывать / объединять их в один диктовку в качестве выходных данных, к входным диктантам будут применены некоторые формулы.Вывод выглядит примерно так: (с полями более 50)

output = {
    'pnl': 100,
    'pnl_usd': 400,
    'pnl_eur': 500,
    'ytd': 200,
    'ytd_usd': 2000,
    'ytd_eur': 3000,
    'mtd': 300,
    'mtd_eur': 300,
    'cost': [
        {'prod_1': {'labour': 1000, 'material': 2000}},
        {'prod_2': {'labour': 2000, 'material': 3000}}
    ]
    # many more fields
}

Интересно, каков наилучший способ реализации этого?Прямо сейчас наши разработчики сначала определили множество локальных переменных, а затем вычислили числа, а затем заполнили dict и вернули его.

def produce_dict(cost_dict, revenue_dict, date):
    pnl = revenue_dict.get('revenue') - cost_dict.get('cost')
    pnl_in_usd = pnl * get_fx_rate(date)
    pnl_in_usd_prev = pnl * get_fx_rate(date - 1)

    pnl_mtd = revenue_dict.get('revenue_mtd') - cost_dict.get('cost_mtd')
    pnl_mtd_in_usd = pnl_mtd * get_fx_rate(date)
    pnl_mtd_in_usd_prev = pnl_mtd * get_fx_rate(date - 1)
    daily_pnl_gain = pnl_mtd_in_usd - pnl_mtd_in_usd_prev

    # many more local variables here
    return {'pnl': pnl, 'pnl_in_usd': pnl_in_usd, etc.etc...}

Есть ли более чистый способ сделать это, отделить логику расчета от построения диктата?Спасибо.

1 Ответ

0 голосов
/ 29 мая 2018

Если вы хотите отделить здание словаря от вычисления переменных, можно использовать метод определения двух функций:

def compute_my_var(var, cost_dict, revenue_dict, date):
   if var == 'pnl':
        return revenue_dict.get('revenue') - cost_dict.get('cost')
   elif var == 'pnl_usd':
        pnl = compute_my_var('pnl', cost_dict, revenue_dict, date)
        return pnl* get_fx_rate(date)
   # ...
   else:
       return ValueError

Вторая функция будет:

def build_output(cost_dict, revenue_dict, date):
    variables = ['pnl', 'pnl_usd', 'foo', 'bar']
    output = {var:compute_my_var(var, cost_dict, revenue_dict, date) for var in vars}

Пока что,Я не уверен, будет ли это самым питоническим способом.Другие сомнения, возможно, они могли бы быть более эффективным / оптимизированным способом, чем каждый раз передавать словарь входных данных: может быть как переменная модуля?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...