这张图里谁依赖谁
(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()))
全部评论