这张图里谁依赖谁

👁️ 3 人浏览 💬 0 人评论 ❤️ 添加收藏

(IMPORTS 记每个模块 import 了谁;deps_of 一路找到全部间接依赖;who_imports 找谁用了它;has_cycle 判有没有循环 import;order 给出「被依赖的先、依赖别人的后」的顺序。)

贯穿 n06 的工程:

app/
  __init__.py
  cli.py          # import app.core.report, app.util
  util.py
  core/
    __init__.py
    report.py     # import app.core.calc, app.util
    calc.py

看 cli 的全部间接依赖、util 被谁用、有没有环:

IMPORTS = {
    "app.cli": ["app.core.report", "app.util"],
    "app.core.report": ["app.core.calc", "app.util"],
    "app.core.calc": [],
    "app.util": [],
}


def deps_of(mod, seen=None):
    seen = set() if seen is None else seen
    for d in IMPORTS.get(mod, []):
        if d not in seen:
            seen.add(d)
            deps_of(d, seen)
    return seen


def who_imports(mod):
    return sorted(m for m, ds in IMPORTS.items() if mod in ds)


def has_cycle():
    for m in IMPORTS:
        if m in deps_of(m):
            return True
    return False


def order():
    out = []
    while len(out) < len(IMPORTS):
        for m in sorted(IMPORTS):
            if m not in out and all(d in out for d in IMPORTS[m]):
                out.append(m)
    return out

print(",".join(sorted(deps_of("app.cli"))) + "/" + ",".join(who_imports("app.util")) + "/" + str(has_cycle()))
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论