如何在Python中用变量替换函数调用的一部分



我有一个字典,里面有一些函数表达式作为值。除了在中间部分之外,每个值都非常相似。在以下示例中,只有earn_yldfree_cash_flow_yieldeps_growth在长公式中不同。

factor_bql = {
"ltm_earnings_yield": bq.func.dropna(bq.data.earn_yld(as_of_date=bq.func.RANGE(params['start'],params['end']))),
"ltm_fcf_yield": bq.func.dropna(bq.data.free_cash_flow_yield(as_of_date=bq.func.RANGE(params['start'],params['end']))),
'ltm_eps_growth': bq.func.dropna(bq.data.eps_growth(as_of_date=bq.func.RANGE(params['start'],params['end'])))
}

有没有什么方法可以写一个函数或变量来将字典的值简化为类似的值

def simple_formula(xyz):
... ...
factor_bql = {
"ltm_earnings_yield": simple_formula('earn_yld'),
"ltm_fcf_yield": simple_formula('free_cash_flow_yield'),
'ltm_eps_growth': simple_formula('eps_growth')
}

我会用以下方式来做:

def simple_formula(fn):
return bq.func.dropna(fn(as_of_date=bq.func.RANGE(params['start'],params['end'])))
factor_bql = {
"ltm_earnings_yield": simple_formula(bq.data.earn_yld),
"ltm_fcf_yield": simple_formula(bq.data.free_cash_flow_yield),
'ltm_eps_growth': simple_formula(bq.data.eps_growth)
}

因此,函数本身(而不是它们的名称(是simple_formula的参数。

您可以使用globals函数通过其名称的字符串表示来调用当前模块中的函数。

def func1(bar):
return "func1" + str(bar)

def func2(bar):
return "func2" + str(bar)

def simple_formula(func_name):
return globals()[func_name](bar="baz")

factor_bql = {
"key1": simple_formula("func1"),
"key2": simple_formula("func2"),
}
print(factor_bql["key2"]) # prints "func2baz"

假设bq.data是某个对象:

def simple_formula(xyz):
method = getattr(bq.data, xyx) # get a method by its name
return bq.func.dropna(method(as_of_date=bq.func.RANGE(params['start'],params['end'])))

最新更新