Доступ к контексту 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)

Не очень красиво, но может отвлечься. Каков ваш конкретный вариант использования? Зачем вам нужно имя узла и имя записи каталога в узле?

Другие вопросы по тегам