Я считаю, что класс NodeSelector из базового API Python ядра dbt может мне здесь помочь, но я возникли некоторые проблемы при попытке использовать этот класс. Конструктор этого класса ожидает, что я предоставлю график dbt (dbt.graph.graph.Graph) и манифест dbt (dbt.contracts.graph.manifest.Manifest), но когда я делаю это и запускаю свой код, я получаю ошибку TypeError. : объект 'dict' не может быть вызван.
Из того, что я исследовал, ошибка, похоже, возникает в строке 53 файл core/dbt/graph/selector.py, в котором вызывается функция .nodes(). Кажется, что Python разрешает узлы как объект dict, и они не могут быть вызваны, поэтому я получаю эту ошибку TypeError всякий раз, когда пытаюсь создать экземпляр объекта из этого класса.
Вот минимальный воспроизводимый пример пример (предполагается, что существует проект dbt, который в какой-то момент был успешно запущен — существует файл манифеста.json):
Код: Выделить всё
import json
import os
from dbt.contracts.graph.manifest import Manifest
from dbt.graph.graph import Graph
from dbt.graph.selector import NodeSelector
dbt_project_dir = ""
manifest_path = os.path.join(dbt_project_dir, "target", "manifest.json")
with open(manifest_path, "r") as f:
manifest_json = json.load(f)
manifest = Manifest.from_dict(manifest_json)
my_graph = Graph(manifest)
# This line errors with a message saying: TypeError: 'dict' object is not callable
NodeSelector(graph=my_graph, manifest=manifest)
Код: Выделить всё
try:
print(type(my_graph.nodes))
print(my_graph.nodes())
except Exception as exc:
print(exc)
Код: Выделить всё
'dict' object is not callable
Есть идеи по поводу того, что здесь происходит? Я думаю, что это может быть как-то связано со свойством nodes Digraph сетиx, которое может возвращать объект или метод, похожий на dict, но я не уверен. Может кто-нибудь помочь мне создать экземпляр этого класса?
Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/792 ... python-api