创建具有许多公式的复杂字典的最佳实践

时间:2018-05-29 14:57:24

标签: python design-patterns

我正在处理需要将几个dicts作为输入参数并将它们转换/合并为单个dict作为输出的需求,将会有一些公式应用于输入dicts。输出如下所示:(有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 :(得分:0)

如果要将字典构建形式与变量计算分开,方法可以定义两个函数:

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}

然而,我不确定这是否是最pythonic的方式。其他疑问,也许它们可能比每次传递输入字典更有效/优化的方式:可能作为模块变量?