内容
# 🗺️ py-code-visualizer
[](https://pypi.org/project/py-code-visualizer/)
[](https://pypi.org/project/py-code-visualizer/)
[](https://github.com/haider1998/PyVisualizer/actions/workflows/ci.yml)
[](https://www.python.org/downloads/)
[](https://opensource.org/licenses/MIT)
[](#architecture)
> **确定且经过 AST 验证的 Python 架构基准。**
> LLM 推测您的架构。 **py-code-visualizer 证明这一点** — 每个边都可以追溯到 `文件:行`。
<p align="center">
<img src="docs/images/terminal-demo.svg" alt="py-code-visualizer: pip install, then visualize your project into a self-contained interactive map" width="720">
</p>
<p align="center">
<b><a href="https://haider1998.github.io/pyvisualizer/playground.html">⚡ 在浏览器中试用 →</a></b>
· 拖放一个 <code>.py</code> 文件,查看图表,无需上传
</p>
py-code-visualizer 通过静态分析读取您的 Python 源代码(无需导入或执行代码),并生成一个您可以信任的调用图:自我修复的 README 图表、PR 架构变更报告、阻止循环依赖的 CI 门控,以及一个完全离线的交互式地图。因为输出是 **确定的**,所以它存在于您的管道中,并且永远不会漂移。
```bash
pip install py-code-visualizer && py-code-visualizer visualize .
```
**适用于谁?** 任何 Python 开发者,无论您的技术栈如何:
[**Django**](https://haider1998.github.io/pyvisualizer/for/django.html) (实际请求流程,而不仅仅是模型架构) ·
[**FastAPI**](https://haider1998.github.io/pyvisualizer/for/fastapi.html) (每个路由的爆炸半径,异步 + 装饰器) ·
[**机器学习管道**](https://haider1998.github.io/pyvisualizer/for/ml-pipelines.html) (映射管道,找到死亡实验)。查看
[诚实的比较](https://haider1998.github.io/pyvisualizer/compare.html) 和
[测量事实](https://haider1998.github.io/pyvisualizer/facts.html)。
---
## 为什么存在(以及为什么 LLM 无法做到)
LLM 请求绘制您的存储库图表时会生成它 *期望* 一个类似的存储库具有的架构 — 看似合理,自信,但微妙地错误。它在模块之间发明了从未相互调用的链接,默默地删除了不适合上下文窗口的内容,并每次运行给出不同的答案,因此您无法对其进行差异比较或放入 CI 中。
PyVisualizer 在构造上与之相反:
| | LLM 图表 | PyVisualizer |
|---|---|---|
| **正确性** | 推断,通常是幻觉 | 从 AST 解析 |
| **出处** | 无 | 每个边 → `文件:行` |
| **确定性** | 每次运行都不同 | 字节相同 |
| **模糊性** | 隐藏在置信度后面 | 标记,候选项保留 |
| **可 CI 化** | 否 | 是 — 门控,差异,漂移检查 |
| **代码离开机器** | 通常 | 永远不会 |
当一个调用无法解析为一个目标时,我们 **不会选择一个并假装** — 我们将边标记为 `ambiguous` 并保留完整的候选项列表。这种诚实是整个产品。
---
## 安装
```bash
pip install py-code-visualizer
```
## 60 秒开始
```bash
# 交互式,完全自包含的 HTML 地图(离线打开,零网络)
py-code-visualizer visualize ./your_project -o architecture.html
# 在 README 中永久保留一个实时图表
py-code-visualizer readme ./your_project
# 如果有新的循环依赖,则失败 CI
py-code-visualizer check ./your_project --fail-on-cycles
# 什么会破坏如果我触摸这个函数?
py-code-visualizer impact your_pkg.core.save ./your_project
```
---
## ⚡ AI 代理上下文 — 减少 97% 的令牌
> **完整指南:** [AI_CONTEXT.md](AI_CONTEXT.md)
与其将整个代码库粘贴到 Claude / ChatGPT / Cursor 中,不如给它一个经过验证的 4,000 个令牌切片,这些切片实际上很重要。三个命令涵盖了每个工作流程:
```bash
# 选项 A — 用纯英语描述任务(无需函数名)
py-code-visualizer context . --task "add retry logic to the HTTP client" --budget-tokens 4000
# 选项 B — 您知道函数
py-code-visualizer context . --focus send_request --budget-tokens 4000
# 选项 C — 永久连接(代理自动读取)
py-code-visualizer export --for-ai .
```
**复制 A 或 B 的输出 → 在 AI 聊天中粘贴,然后提问。**
AI 现在拥有正确的上下文,而不是 140,000 个猜测的令牌。
| 方法 | 令牌 | Claude Opus 5 成本 | 每 1k 令牌的信号 |
|---|---|---|---|
| 完整源代码 | 139,697 | $2.10 | 1× |
| 关键字 grep | 24,652 | $0.37 | 6× |
| **pyvisualizer `--task`** | **~4,000** | **$0.06** | **35×** |
_在 httpx 上测量(真正的开源项目,1,076 个函数)。参见 [measured facts](https://haider1998.github.io/pyvisualizer/use-cases/agent-context.html)。_
---
## 对于一个充满活力的初创公司 🚀
您永远不会安排一次“文档冲刺”。所以不这样做。在 CI 中添加一行,您的 README 始终包含一个当前的架构图 — 无需免费的投资者和尽职调查 — 同时每个 PR 都会显示结构上发生了什么变化。
```yaml
# .github/workflows/architecture.yml
- uses: haider1998/PyVisualizer@v2
with: { mode: readme }
```
新承包商从交互式地图开始,而不是三天的 Slack 问答。支点不再是考古学。
## 对于一家大型企业 🏛️
- **代码永远不会离开机器。** 纯 AST,无执行,无 API 调用 — 安全审查的反 LLM 工具。生成的 HTML 是一个零网络请求的文件(安全气隙)。
- **代码架构门控。** 声明层和禁止依赖;构建因违规而失败 — 在调用图级别,比导入检查更严格。
- **审计跟踪。** 由 CI 提交的确定性图表使 git 历史记录成为您的有日期的,可归因的架构变更日志(SOC 2 / 审查委员会)。
- **大型代码库规模。** 分层汇总(模块 → 类 → 函数),从不沉默采样。
```toml
# pyproject.toml
[tool.pyvisualizer.rules]
layers = ["api", "domain", "infra"]
forbid = ["domain -> api", "domain -> infra"]
```
---
## 命令
| 命令 | 它执行的操作 |
|---|---|
| `review <path> --base <ref>` | **PR 审查报告**:更改的函数,爆炸半径,风险标志,聚焦的子图 — 可点击的 `文件:行` 每个引用 |
| `context <path> --focus <fn>` | **AI 代理的验证上下文包**:任务范围,预算范围,零猜测边 |
| `context <path> --task "<prose>"` | 相同的包,从 **自然语言任务描述** 中播种(命名符号优先,词汇匹配作为标记提示;`--strategy graph\|text\|hybrid`) |
| `visualize` | 渲染 `html` · `mermaid` · `json` · `c4` · `svg`/`png` |
| `readme` | 在任何 Markdown 文件中注入/更新 Mermaid 图表(幂等)+ 跳转到源索引 |
| `json` | 发出规范的,可差异的图 JSON |
| `diff base.json head.json` | PR-ready 架构变更报告(+ 新周期门控) |
| `check` | 强制执行分层规则和周期 — CI 门控(也包括 `--dead-code`) |
| `impact <fn>` | 爆炸半径:传递调用者/被调用者 + 风险线(`--format markdown`) |
| `health` | 架构健康评分(A-F)与 SVG 徽章 |
| `export` | `ARCHITECTURE.json` + `ARCHITECTURE.md` + AGENTS.md 接线(`--check` 新鲜度门控) |
| `init` | 选择加入设置 — 仅生成您选择的自动化(`review`/`readme`/`context`/`gates`) |
**两个作业,一个引擎。** *review* 使大型代码库的代码审查成为一个专注的几分钟过程;*context* 为 AI 代理提供了一个验证的,**小 97%** 的架构切片,而不是整个代码库。参见 [`VISION.md`](VISION.md) 和
[用例演练](https://haider1998.github.io/pyvisualizer/use-cases/)。
### MCP 服务器(实时,任务中)
如果您使用 Claude Code 或 Cursor,MCP 服务器允许代理在需要时查询验证的图表 — 无需手动复制粘贴:
```bash
pip install 'py-code-visualizer[mcp]' # Python 3.10+
pyvisualizer-mcp /path/to/project
```
添加到 `.mcp.json` 并启用三个工具:`search_code`,`context_pack` 和 `impact`。服务器仅在文件更改时重新构建。
完整使用指南(所有标志,故障排除,输出演练): **[AI_CONTEXT.md](AI_CONTEXT.md)**
## 用例(真实命令,真实输出)
三个端到端演练,每个演练都由 [`examples/scenarios/`](examples/scenarios) 中的可运行固定装置支持 — 每个命令和每行输出都是可复制的,什么都不是暂时的:
- 🗺️ **[孤立的单体](https://haider1998.github.io/pyvisualizer/use-cases/orphan-monolith.html)** —
使用 `visualize` + `health` + `check --dead-code` 入门到未记录的代码库。
- 🛡️ **[审计截止日期](https://haider1998.github.io/pyvisualizer/use-cases/soc2-audit.html)** —
在调用图级别强制执行分层规则并生成已过期的 SOC 2 证据。
- 🧨 **[无畏的重构](https://haider1998.github.io/pyvisualizer/use-cases/fearless-refactor.html)** —
`impact` 爆炸半径,然后是一个在新周期上失败的 PR 的 `diff` 门控。
查看 [完整的用例索引 + 每个命令的配方](https://haider1998.github.io/pyvisualizer/use-cases/)。
**测量**(使用 `python benchmarks/bench.py` → [`docs/benchmarks.json`](docs/benchmarks.json) 复制):
一个 **98,669 行** 的项目映射到一个完整的调用图,耗时 **~4.9 秒** (26,658 个函数),
**100%** 边携带 `文件:行`,输出在运行之间 **字节相同**,生成的 HTML 进行 **0** 网络请求。 *(macOS arm64,Python 3.14;速度依赖于硬件 — 出处,确定性和零网络是结构性的。)*
## 交互式地图
一个自包含的 HTML 文件(无需 CDN,离线工作):
- **分层抽象** — 切换模块 → 类 → 函数视图
- **点击任意节点** — 签名,`文件:行`,调用者和被调用者(均可点击)
- **⌘K 命令面板**,实时搜索,模块过滤
- **深链接** — URL 编码所选节点;将其粘贴到 Slack 中,您的队友将跳转到确切的函数
- **游览模式** — 从检测到的入口点自动生成的演练
- **叠加层** — 周期(红色),模糊性(虚线)和 `--churn` git-heatmap
- 缩略图,缩放/平移/拖动,浅色/深色,SVG 导出
## 将图表提供给您的 AI 工具
```bash
py-code-visualizer export --for-ai ./your_project
```
将 Cursor / Claude 指向验证的 `ARCHITECTURE.json`,而不是要求模型从原始源代码中重新导出结构。 **将代理指向图表,而不是代码库。**
---
## 精确度保证
- 嵌套类,方法和闭包被收集并具有正确的限定名称(`pkg.Outer.Inner.method`,`mod.func.<locals>.inner`)。
- 链式调用(`get_client().fetch()`),理解和 lambda 表达式被捕获。
- `super()`/继承调用通过计算的 MRO 解析(标记为 `inherited`)。
- 参数和变量类型注释驱动方法解析。
- 对标准库/第三方代码的调用产生 **无边** — 我们永远不会发明一个。
- 模糊调用被标记并作为候选项保留; `--strict` 删除它们。
查看 [`docs/integrations.md`](docs/integrations.md) 以获取 GitHub Actions,GitLab CI 和 pre-commit 设置。
## 配置
```toml
[tool.pyvisualizer]
exclude = ["tests", "migrations"]
max_nodes = 120
target = "README.md"
detail = "module" # module | class | function
```
## 路线图
- ⏳ **时间旅行** — 浏览您的架构在发布期间的演变
- 🔁 **监视模式** — 在您重构时实时加载地图
- ✅ ~~**MCP 服务器**~~ — 已发布:`pyvisualizer-mcp`(`search_code`,`context_pack`,`impact`)
## 架构
下图由PyVisualizer自身生成,并通过CI保持同步。
<!-- pyvisualizer:start -->
<!-- This diagram is auto-generated by py-code-visualizer. Do not edit by hand; run `py-code-visualizer readme` to refresh. -->
*120个函数 · 214个调用 · 健康度 F (46/100) — 详情:模块*
```mermaid
flowchart LR
g0["基准测试"]
g1["生成项目"]
g2["主函数"]
g3["模型"]
g4["服务"]
g5["URL"]
g6["仓库"]
g7["服务"]
g8["评估"]
g9["特征"]
g10["数据摄入"]
g11["流水线"]
g12["训练"]
g13["命令行接口"]
g14["流水线"]
g15["转换"]
g16["核心"]
g17["服务"]
g18["计费"]
g19["API"]
g20["变更"]
g21["命令行接口"]
g22["配置"]
g23["上下文"]
g24["分析器"]
g25["图"]
g26["差异"]
g27["导出"]
g28["门控"]
g29["影响"]
g30["注入"]
g31["MCP服务器"]
g32["指标"]
g33["叠加层"]
g34["检索"]
g35["审查"]
g36["C4"]
g37["JSON图"]
g38["设置初始化"]
g39["文件发现"]
g40["D3"]
g41["HTML"]
g42["Mermaid"]
g0 --> g1
g0 --> g19
g0 --> g37
g0 --> g41
g1 --> g6
g4 --> g3
g7 -.-> g4
g7 --> g6
g11 --> g8
g11 --> g9
g11 --> g10
g11 --> g12
g13 --> g14
g14 -.-> g7
g14 --> g15
g15 -.-> g4
g17 --> g16
g19 --> g25
g19 --> g31
g19 --> g39
g20 --> g31
g20 --> g33
g21 --> g14
g21 --> g19
g21 --> g22
g21 --> g23
g21 --> g26
g21 --> g27
g21 --> g28
g21 --> g29
g21 --> g30
g21 --> g31
g21 --> g32
g21 --> g33
g21 --> g35
g21 --> g36
g21 --> g37
g21 --> g40
g21 --> g42
g22 --> g31
g23 --> g4
g23 --> g20
g23 --> g28
g23 --> g29
g23 --> g31
g23 --> g32
g23 --> g33
g23 --> g34
g24 --> g31
g25 --> g4
g25 --> g31
g26 --> g4
g26 --> g31
g26 --> g32
g27 --> g28
g27 --> g30
g27 --> g31
g27 --> g32
g27 --> g37
g28 --> g31
g29 --> g20
g31 --> g19
g31 --> g23
g31 --> g29
g31 --> g34
g32 --> g31
g32 --> g34
g33 --> g31
g34 --> g4
g34 --> g31
g35 --> g20
g35 --> g28
g35 --> g31
g35 --> g32
g35 --> g42
g36 --> g42
g37 --> g31
g38 --> g19
g38 --> g30
g38 --> g31
g38 --> g32
g38 --> g42
g39 --> g4
g39 --> g6
g40 --> g41
g41 --> g37
g42 --> g31
```
<sub>🔒 确定性,AST验证 - 没有执行代码。由 [py-code-visualizer](https://github.com/haider1998/PyVisualizer) 生成。</sub>
<details>
<summary>📍 跳转到源代码(120个函数)</summary>
- [`benchmarks.bench._bench_target`](benchmarks/bench.py#L177)
- [`benchmarks.bench._determinism_proof`](benchmarks/bench.py#L113)
- [`benchmarks.bench._html_network_proof`](benchmarks/bench.py#L132)
- [`benchmarks.bench.run`](benchmarks/bench.py#L221)
- [`benchmarks.genproject._gen_module`](benchmarks/genproject.py#L41)
- [`benchmarks.genproject.generate`](benchmarks/genproject.py#L135)
- [`examples.sample_project.main.main`](examples/sample_project/main.py#L7)
- [`examples.scenarios.django_shop.models.Cart.for_user`](examples/scenarios/django_shop/models.py#L12)
- [`examples.scenarios.django_shop.services.CartService.add`](examples/scenarios/django_shop/services.py#L11)
- [`examples.scenarios.django_shop.services.OrderService.checkout`](examples/scenarios/django_shop/services.py#L22)
- [`examples.scenarios.django_shop.services.OrderService.get`](examples/scenarios/django_shop/services.py#L29)
- [`examples.scenarios.django_shop.urls.dispatch`](examples/scenarios/django_shop/urls.py#L7)
- [`examples.scenarios.fastapi_svc.repos.OrderRepo.insert`](examples/scenarios/fastapi_svc/repos.py#L8)
- [`examples.scenarios.fastapi_svc.services.OrderFlow.fetch`](examples/scenarios/fastapi_svc/services.py#L22)
- [`examples.scenarios.fastapi_svc.services.OrderFlow.place`](examples/scenarios/fastapi_svc/services.py#L16)
- [`examples.scenarios.ml_pipeline.evaluate.evaluate_model`](examples/scenarios/ml_pipeline/evaluate.py#L4)
- [`examples.scenarios.ml_pipeline.features.build_features`](examples/scenarios/ml_pipeline/features.py#L4)
- [`examples.scenarios.ml_pipeline.ingest.load_dataset`](examples/scenarios/ml_pipeline/ingest.py#L4)
- [`examples.scenarios.ml_pipeline.pipeline.run`](examples/scenarios/ml_pipeline/pipeline.py#L9)
- [`examples.scenarios.ml_pipeline.train.train_model`](examples/scenarios/ml_pipeline/train.py#L4)
- [`examples.scenarios.orphan_monolith.app.cli.run`](examples/scenarios/orphan_monolith/app/cli.py#L7)
- [`examples.scenarios.orphan_monolith.app.pipeline.ReportPipeline.build`](examples/scenarios/orphan_monolith/app/pipeline.py#L11)
- [`examples.scenarios/orphan_monolith.app.pipeline.ReportPipeline.render`](examples/scenarios/orphan_monolith/app/pipeline.py#L16)
- [`examples.scenarios/orphan_monolith.app.transforms.summarize`](examples/scenarios/orphan_monolith/app/transforms.py#L11)
- [`examples.scenarios/refactor.after.core.persist`](examples/scenarios/refactor/after/core.py#L7)
- [`examples.scenarios/refactor.after.service.cancel_order`](examples/scenarios/refactor/after/service.py#L11)
- [`examples.scenarios/refactor.after.service.place_order`](examples/scenarios/refactor/after/service.py#L7)
- [`examples.scenarios/soc2_audit.domain.billing.BillingService.charge`](examples/scenarios/soc2_audit/domain/billing.py#L12)
- [`pyvisualizer.api.build_graph`](pyvisualizer/api.py#L47)
- [`pyvisualizer.changes.Linker.ref`](pyvisualizer/changes.py#L202)
- [`pyvisualizer.changes.changed_lines_from_git`](pyvisualizer/changes.py#L62)
- [`pyvisualizer.changes.map_lines_to_functions`](pyvisualizer/changes.py#L121)
- [`pyvisualizer.changes.repo_web_url`](pyvisualizer/changes.py#L149)
- [`pyvisualizer.changes.resolve_base_ref`](pyvisualizer/changes.py#L46)
- [`pyvisualizer/cli/_build`](pyvisualizer/cli.py#L283)
- [`pyvisualizer/cli/_render_graphviz`](pyvisualizer/cli.py#L368)
- [`pyvisualizer/cli/cmd_check`](pyvisualizer/cli.py#L588)
- [`pyvisualizer/cli/cmd_context`](pyvisualizer/cli.py#L706)
- [`pyvisualizer/cli/cmd_diff`](pyvisualizer/cli.py#L550)
- [`pyvisualizer/cli/cmd_export`](pyvisualizer/cli.py#L647)
- [`pyvisualizer/cli/cmd_health`](pyvisualizer/cli.py#L623)
- [`pyvisualizer/cli/cmd_impact`](pyvisualizer/cli.py#L669)
- [`pyvisualizer/cli/cmd_readme`](pyvisualizer/cli.py#L458)
- [`pyvisualizer/cli/cmd_review`](pyvisualizer/cli.py#L681)
- [`pyvisualizer/cli/cmd_visualize`](pyvisualizer/cli.py#L302)
- [`pyvisualizer/cli/main`](pyvisualizer/cli.py#L264)
- [`pyvisualizer/config/load_config`](pyvisualizer/config.py#L102)
- [`pyvisualizer/context/_est_tokens`](pyvisualizer/context.py#L135)
- [`pyvisualizer/context/_node_line`](pyvisualizer/context.py#L110)
- [`pyvisualizer.context/_resolve_focus`](pyvisualizer/context.py#L83)
- [`pyvisualizer.context/_select_nodes`](pyvisualizer/context.py#L246)
- [`pyvisualizer.context/_select_text`](pyvisualizer/context.py#L297)
- [`pyvisualizer.context/_upgrade_bodies`](pyvisualizer/context.py#L338)
- [`pyvisualizer.context/build_context_pack`](pyvisualizer/context.py#L387)
- [`pyvisualizer/core/analyzer/DefinitionCollector/_visit_function`](pyvisualizer/core/analyzer.py#L360)
- [`pyvisualizer/core/analyzer/DefinitionCollector.visit_ClassDef`](pyvisualizer/core/analyzer.py#L327)
- [`pyvisualizer/core/analyzer/ModuleAnalyzer/_decorator_names`](pyvisualizer/core/analyzer.py#L158)
- [`pyvisualizer/core/analyzer/ModuleAnalyzer/_extract_attribute_chain`](pyvisualizer/core/analyzer.py#L189)
- [`pyvisualizer/core/analyzer/ModuleAnalyzer/_process_annotation`](pyvisualizer/core/analyzer.py#L259)
- [`pyvisualizer/core/analyzer/ModuleAnalyzer/_process_decorator`](pyvisualizer/core/analyzer.py#L206)
- [`pyvisualizer/core/graph/FunctionCallVisitor/_extract_attribute_chain`](pyvisualizer/core/graph.py#L421)
- [`pyvisualizer/core/graph/FunctionCallVisitor/_extract_call_target`](pyvisualizer/core/graph.py#L407)
- [`pyvisualizer/core/graph/FunctionCallVisitor/_find_method_in_hierarchy`](pyvisualizer/core/graph.py#L329)
- [`pyvisualizer/core/graph/FunctionCallVisitor/_resolve_call`](pyvisualizer/core/graph.py#L201)
- [`pyvisualizer/core/graph/FunctionCallVisitor/_seed_param_types`](pyvisualizer/core/graph.py#L121)
- [`pyvisualizer/core/graph/FunctionCallVisitor/_visit_function_common`](pyvisualizer/core/graph.py#L96)
- [`pyvisualizer/core/graph/build_call_graph`](pyvisualizer/core/graph.py#L475)
- [`pyvisualizer/diff/diff_graphs`](pyvisualizer/diff.py#L84)
- [`pyvisualizer/diff/render_change_mermaid`](pyvisualizer/diff.py#L131)
- [`pyvisualizer/diff/render_markdown`](pyvisualizer/diff.py#L170)
- [`pyvisualizer/export/_agents_md_plan`](pyvisualizer/export.py#L154)
- [`pyvisualizer/export/_json_content`](pyvisualizer/export.py#L113)
- [`pyvisualizer/export/build_ai_markdown`](pyvisualizer/export.py#L32)
- [`pyvisualizer/export/export_for_ai`](pyvisualizer/export.py#L173)
- [`pyvisualizer/export/export_would_change`](pyvisualizer/export.py#L199)
- [`pyvisualizer/gates/check_layer_rules`](pyvisualizer/gates.py#L53)
- [`pyvisualizer/gates/find_cycles`](pyvisualizer/gates.py#L83)
- [`pyvisualizer/impact/analyze_impact`](pyvisualizer/impact.py#L46)
- [`pyvisualizer/impact/render_markdown`](pyvisualizer/impact.py#L96)
- [`pyvisualizer/impact/resolve_target`](pyvisualizer/impact.py#L32)
- [`pyvisualizer/inject/inject`](pyvisualizer/inject.py#L84)
- [`pyvisualizer/inject/inject_block`](pyvisualizer/inject.py#L51)
- [`pyvisualizer/inject/update_file`](pyvisualizer/inject.py#L102)
- [`pyvisualizer/mcp_server/ProjectSession.get`](pyvisualizer/mcp_server.py#L54)
- [`pyvisualizer/mcp_server/tool_context_pack`](pyvisualizer/mcp_server.py#L82)
- [`pyvisualizer/mcp_server/tool_impact`](pyvisualizer/mcp_server.py#L107)
- [`pyvisualizer/metrics/_is_entry_point`](pyvisualizer/metrics.py#L75)
- [`pyvisualizer/metrics/compute_health`](pyvisualizer/metrics.py#L88)
- [`pyvisualizer/metrics/find_dead_code`](pyvisualizer/metrics.py#L153)
- [`pyvisualizer/overlays/_git`](pyvisualizer/overlays.py#L23)
- [`pyvisualizer/overlays/_toplevel`](pyvisualizer/overlays.py#L33)
- [`pyvisualizer/overlays/apply_churn`](pyvisualizer/overlays.py#L67)
- [`pyvisualizer/overlays/git_churn`](pyvisualizer/overlays.py#L41)
- [`pyvisualizer/retrieval/BM25Index.rank`](pyvisualizer/retrieval.py#L120)
- [`pyvisualizer/retrieval/BM25Index.search`](pyvisualizer/retrieval.py#L137)
- [`pyvisualizer/retrieval/build_bm25`](pyvisualizer/retrieval.py#L142)
- [`pyvisualizer/retrieval/derive_seeds`](pyvisualizer/retrieval.py#L189)
- [`pyvisualizer/retrieval/function_source`](pyvisualizer/retrieval.py#L75)
- [`pyvisualizer/retrieval/rank_seeds`](pyvisualizer/retrieval.py#L219)
- [`pyvisualizer/retrieval/tokenize`](pyvisualizer/retrieval.py#L64)
- [`pyvisualizer/review/_risk_lines`](pyvisualizer/review.py#L183)
- [`pyvisualizer/review/analyze_review`](pyvisualizer/review.py#L50)
- [`pyvisualizer/review/render_markdown`](pyvisualizer/review.py#L112)
- [`pyvisualizer/review/render_text`](pyvisualizer/review.py#L198)
- [`pyvisualizer/serializers/c4/generate_c4_dsl`](pyvisualizer/serializers/c4.py#L27)
- [`pyvisualizer/serializers/json_graph/graph_to_dict`](pyvisualizer/serializers/json_graph.py#L65)
- [`pyvisualizer/serializers/json_graph/graph_to_json`](pyvisualizer/serializers/json_graph.py#L162)
- [`pyvisualizer/setup_init/_action_readme`](pyvisualizer/setup_init.py#L232)
- [`pyvisualizer/setup_init/_record_features`](pyvisualizer/setup_init.py#L205)
- [`pyvisualizer/setup_init/run_init`](pyvisualizer/setup_init.py#L305)
- [`pyvisualizer/utils/file_discovery/analyze_project`](pyvisualizer/utils/file_discovery.py#L151)
- [`pyvisualizer/utils/file_discovery/find_project_python_files`](pyvisualizer/utils/file_discovery.py#L38)
- [`pyvisualizer/utils/file_discovery/get_module_name`](pyvisualizer/utils/file_discovery.py#L96)
- [`pyvisualizer/visualizers/d3/generate_d3_visualization`](pyvisualizer/visualizers/d3.py#L18)
- [`pyvisualizer/visualizers/html/generate_html_visualization`](pyvisualizer/visualizers/html.py#L29)
- [`pyvisualizer/visualizers/mermaid/_categorize_methods`](pyvisualizer/visualizers/mermaid.py#L301)
- [`pyvisualizer/visualizers/mermaid/_rollup`](pyvisualizer/visualizers/mermaid.py#L39)
- [`pyvisualizer/visualizers/mermaid/create_interactive_html`](pyvisualizer/visualizers/mermaid.py#L336)
- [`pyvisualizer/visualizers/mermaid/generate_github_mermaid`](pyvisualizer/visualizers/mermaid.py#L82)
- [`pyvisualizer/visualizers/mermaid/generate_styled_mermaid`](pyvisualizer/visualizers/mermaid.py#L114)
</details>
<!-- pyvisualizer:end -->
## 贡献
请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。PyVisualizer 遵循 MIT 许可证。
---
## 作者
**赛义德·莫赫德·海德·里兹维**
[个人主页](https://haider1998.github.io/) · [LinkedIn](https://www.linkedin.com/in/s-m-h-rizvi-0a40441ab/) · [GitHub](https://github.com/haider1998)
连接信息
猜你喜欢
暂无推荐服务器