Доступ к контексту Kedro из декоратора
Я пытаюсь создать декоратор, в котором мне нужна информация о проекте и / или каталоге. Можно ли получить доступ к контексту проекта изнутри декоратора? Я ищу такие вещи, как имя_проекта, имя записи в каталоге и имя узла конвейера.
Я создал способ найти корневой каталог, получив путь к файлу функций inspect.getfile(func)
, затем иду по тропинке, пока не найду .kedro.yml
, но этот метод не работает при использовании функции из библиотеки.
1 ответ
Передача контекста в узлах не рекомендуется и не соответствует архитектуре Kedro (см. https://kedro.readthedocs.io/en/latest/06_resources/02_architecture_overview.html). ВProjectContext
содержит набор узлов (т.е. конвейер), который будет содержать ProjectContext
, который затем попадает в опасную рекурсивную территорию.
Альтернативой может быть: а) передача значений через параметры и ссылка на них в node
входы с использованием params:abc
или б) передача фактических значений в декоратор.
а) Например, project_name
вы можете передать через параметры. Либо введя его вparameters.yml
или динамически путем переопределения метода _get_feed_dict
в ProjectContext
добавить запись {"project_name": self.project_name}
к возвращенному словарю.
б) У вас может быть декоратор, который выглядит так, и передать его 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)
Не очень красиво, но может отвлечься. Каков ваш конкретный вариант использования? Зачем вам нужно имя узла и имя записи каталога в узле?