我正在尝试创建一个装饰器,在其中我需要一些有关项目和/或目录的信息。是否可以从装饰器内部访问项目上下文?我正在寻找项目名称、目录条目名称和管道节点名称等内容。
我创建了一种通过获取函数文件路径来查找根目录的方法inspect.getfile(func)
,然后沿着路径向上直到找到.kedro.yml
,但是当使用库中的函数时,此方法会中断。
不建议在节点中传递上下文,并且不适合 Kedro 架构(请参阅https://kedro.readthedocs.io/en/latest/06_resources/02_architecture_overview.html)。ProjectContext
持有节点集合(即管道),这些节点将持有,ProjectContext
然后进入危险的递归领域。
替代方法是 a) 通过参数传递值,并在node
输入中使用引用它们params:abc
,或者 b) 在装饰器中传递实际值。
a) 例如,project_name
您可以通过参数传入。通过将其输入parameters.yml
或通过重写中的方法动态地_get_feed_dict
向返回的字典ProjectContext
添加条目。{"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)
不是超级漂亮,但可以让你摆脱困境。您的确切用例是什么?为什么需要节点中的节点名称和目录条目名称?