【问题标题】:Access Kedro context from decorator从装饰器访问 Kedro 上下文
【发布时间】:2019-11-20 19:12:52
【问题描述】:

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

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

【问题讨论】:

    标签: python kedro


    【解决方案1】:

    不建议在节点中传递上下文,并且不适合 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)
    

    不是超级漂亮,但可以让你摆脱困境。您的确切用例是什么?为什么节点中需要节点名和商品名?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-27
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 2012-01-29
      • 2017-08-15
      相关资源
      最近更新 更多