从装饰器访问 Kedro 上下文



我正在尝试创建一个装饰器,我需要一些有关项目和/或目录的信息。 是否可以从装饰器内部访问项目上下文? 我正在寻找project_name、目录条目名称和管道节点名称等内容。

我创建了一个通过获取函数文件路径inspect.getfile(func)来查找根目录的方法,然后沿着路径向上走,直到找到.kedro.yml,但是当使用库中的函数时,此方法会中断。

不建议在节点中传递上下文,并且不适合 Kedro 架构(请参阅 https://kedro.readthedocs.io/en/latest/06_resources/02_architecture_overview.html(。ProjectContext包含节点的集合(即管道(,这将容纳ProjectContext,然后进入危险的递归三元。

替代方案是 a( 通过参数传递值,并使用 params:abcnode输入中引用它们,或者 b( 在装饰器中传递实际值。

一( 例如,project_name您可以通过参数传入。通过在parameters.yml中输入它,或通过重写ProjectContext_get_feed_dict的方法动态输入,以将条目{"project_name": self.project_name}添加到返回的字典中。

b( 你可以有一个看起来像这样的装饰器,并将其传递给Node.decorate()

from functools import partial, wraps
from kedro.pipeline import Pipeline, node

def print_metadata(func, **outer_kwargs):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print("METADATA: {}".format(outer_kwargs))
        return func(*args, **kwargs)
    return wrapper

p1 = Pipeline([node(...), ...])
decorated_nodes = [
    n.decorate(partial(print_metadata, node_name=n.name, catalog_entries=n.inputs))
    for n in p1.nodes
]
p2 = Pipeline(decorated_nodes)

不是超级漂亮,但可以让你解开困境。您的确切用例是什么?为什么节点中需要节点名称和目录条目名称?

最新更新