Рубрики
Без рубрики

До Привязать аргументы для динамически сгенерированных лямбдас в Python

Эта прошлая неделя у меня была действительно странная ошибка в моем конвейере Kedro. По какой-то причине данные, проходящие через M … с меткой Python, Datascity, Data.

Эта прошлая неделя у меня была действительно странная ошибка в моем Кедро трубопровод. По какой-то причине данные, проходящие через мой трубопровод, выходили, не имели смысла, но если я вручную запрашиваю необработанные данные за пределами трубопровода, который он соответствовал ожиданиям.

Примечание Хотя эта история состоит в том, что трубопровод 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”