我正在处理需要将几个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...}
是否有更简洁的方法来执行此操作,将计算逻辑与构建字典分开?感谢。
答案 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的方式。其他疑问,也许它们可能比每次传递输入字典更有效/优化的方式:可能作为模块变量?