Эта прошлая неделя у меня была действительно странная ошибка в моем Кедро трубопровод. По какой-то причине данные, проходящие через мой трубопровод, выходили, не имели смысла, но если я вручную запрашиваю необработанные данные за пределами трубопровода, который он соответствовал ожиданиям.
Примечание Хотя эта история состоит в том, что трубопровод KEDRO, его можно применять в любую тодную точку закрывания.
Через несколько дней взгляда на его выкл и дальше я определил, что это был весь путь в сыром слое. Прямо, поскольку данные выходят из базы данных. Для этого я уже имел существующую SQL
Файлы хранятся и A read_sql.
Функция, чтобы получить данные, поэтому я решил просто настроить трубопровод для максимально возможного использования существующего кода, опираясь на Кедро рамки немного меньше.
У меня есть динамически созданные списки узлов трубопроводов много раз в прошлом, но обычно принимаем данные из Кедро введите и использовать его в лямбде. Я предпочитаю простоту использовать лямбдас над functools.partial.
. Обычно это выглядит что-то подобное.
# 👍 I do this all the time from kedro.pipeline import node from my_generic_project_lib import clean datasets_to_clean = ['sales', 'production', 'inventory'] nodes = [] for dataset in datasets_to_clean: nodes.append( node( func=lambda x: clean(x) inputs = f'raw_{dataset}' outputs=f'int_{dataset}' tags=['int', dataset] name=f'create_int_{dataset}' ) )
На этот раз по-другому было разное, это то, что мне нужно было пройти во имя набора данных для моей функции Read_SQL, а не загруженные в рамках Framework.
# ❌ This does not work from kedro.pipeline import node from my_generic_project_lib import read_sql datasets_to_read = ['sales', 'production', 'inventory'] nodes = [] for dataset in datasets_to_clean: nodes.append( node( func=lambda: read_sql(dataset) # 💥 The major issue inputs = f'dummy' outputs=f'int_{dataset}' tags=['int', dataset] name=f'create_int_{dataset}' ) )
Как мне все еще не обращает, что произошло, я выплыл в точка останова ()
и быстро увидеть, что во время первого запуска набор данных прошел в read_sql
был «Инвентаризация»
На самом деле, каждый был один был «Инвентаризация»
Отказ Лямбда просто использует новейшее значение набора данных снаружи и нет Местный
DataSet
прилагается к нему.
# 👍 Much Better from kedro.pipeline import node from my_generic_project_lib import read_sql datasets_to_read = ['sales', 'production', 'inventory'] nodes = [] for dataset in datasets_to_clean: nodes.append( node( func=lambda dataset=dataset: read_sql(dataset) # dataset is now bound to the lambda ✨ inputs = f'dummy' outputs=f'int_{dataset}' tags=['int', dataset] name=f'create_int_{dataset}' ) )
Я сделал немного более простой пример, чтобы вы могли попробовать его и играть с этим самостоятельно, редактировать его, поделиться этим с друзьями, смеяться над моей ошибкой, что бы вы ни понравились.
Оригинал: “https://dev.to/waylonwalker/til-bind-arguments-to-dynamically-generated-lambdas-in-python-ak9”