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

2024-10-01 11:30:23 发布

您现在位置: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')
}

Tags: freecashparamsepssimpleflowbqfunc
3条回答

假设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'])))

您可以使用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"

我会用以下方法来做:

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的参数

相关问题 更多 >