Эта прошлая неделя у меня была действительно странная ошибка в моем Кедро трубопровод. По какой-то причине данные, проходящие через мой трубопровод, выходили, не имели смысла, но если я вручную запрашиваю необработанные данные за пределами трубопровода, который он соответствовал ожиданиям.
Примечание Хотя эта история состоит в том, что трубопровод 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”