首页 > 解决方案 > 从 YAML 文件传递​​ Python 函数

问题描述

我有一个 YAML 脚本,用户可以在其中定义一些参数。他们还可以在 YAML 文件中声明他们想要应用的自定义函数。例如:

processes:
    args1: 10
    args2: 5
    funct: np.sum

此 YAML 将传递给如下函数:

def custom_func(args1, args2, funct):
    return funct(args1, args2)

对于上面的 YAML 示例,我希望custom_func()执行np.sum(10,5). 如何使 YAML 文件中的数据被解析为 Callable?eval()可能做的工作,但它可能有安全问题。有什么合适的方法吗?谢谢!

标签: pythonyaml

解决方案


您还可以加载给定 Python 虚线路径的函数。

但是,这只是获取函数并调用它,它不会尝试找出调用签名,即np.sum([5,10])不是np.sum(10,5)

from yaml import safe_load as yload
from importlib import import_module

def load_func(dotpath : str):
    """ load function in module.  function is right-most segment """
    module_, func = dotpath.rsplit(".", maxsplit=1)
    m = import_module(module_)
    return getattr(m, func)
    
yaml = """
processes:
    args1: 10
    args2: 5

    #gotta give real package name, not `np`
    funct: numpy.sum
"""

di = yload(yaml)
pr = di["processes"]
func = load_func(pr["funct"])
array = [pr["args1"], pr["args2"]]

print (f"{func=} {func(array)=}")

输出:

func=<function sum at 0x106645e50> func(array)=15

推荐阅读