Pylint Pyreverse 配置完全指南:从命令行选项到 UML 图生成实战

发布时间:2026/10/12 5:21:49
Pylint Pyreverse 配置完全指南:从命令行选项到 UML 图生成实战 静态分析代码质量Lint开发工具【免费下载链接】pylintIts not just a linter that annoys you!项目地址https://gitcode.com/gh_mirrors/pyl/pylint点击查看免费下载pyreverse是随 pylint 一起分发的 UML 图生成工具它把 Python 包/模块解析为类图与包图帮助开发者直观掌握类的继承、关联与包依赖关系。本文以仓库内 配置参考文档 为主体系统讲解pyreverse的全部命令行选项过滤与范围、显示、输出控制、项目配置四大类并结合 源码实现 解释每个选项的底层机制。读完后你将能精准控制图中包含哪些类、以何种外观输出、生成哪些格式的文件并学会用-c聚焦单个类生成协作图。上图为 pyreverse 生成的包图Package Diagram示例展示模块间的依赖关系。上图为 pyreverse 生成的类图Class Diagram示例展示类之间的继承与关联。基本用法与选项分组pyreverse从命令行启动基本语法为pyreverse [options] packages其中packages是一个或多个待分析的 Python 包或模块。例如# 分析整个 pylint 包 pyreverse pylint # 同时分析多个包 pyreverse pylint.checkers pylint.pyreverse该命令的入口点定义在 pyproject.toml 中scripts.pyreverse pylint:run_pyreverse因此安装 pylint 后即可直接使用pyreverse命令。pyreverse的全部选项定义在 pylint/pyreverse/main.py 的OPTIONS_GROUPS与OPTIONS中按用途分为四组分组作用Filtering and Scope过滤与范围控制哪些类、哪些关系出现在图中Display Options显示选项定制颜色、标签等视觉外观Output Control输出控制选择输出格式与目标目录Project Configuration项目配置定义源根目录、忽略文件等工程设置值得注意的是configuration.rst 这份文档是由 Sphinx 扩展 doc/exts/pyreverse_configuration.py 在构建时从Run.options自动生成的因此文档内容与源码中的选项定义严格一一对应不会出现文档与实现脱节的问题。过滤与范围Filtering and Scope这组选项决定图上画什么是控制图规模最关键的参数。默认情况下pyreverse会为项目生成一张包图和一张类图通过祖先、关联与可见性过滤你可以大幅收缩图的复杂度。控制可见性--filter-mode--filter-modemode 短选项 -f默认值PUB_ONLY控制属性和方法按什么可见性规则进入图。合法的mode有四种且在源码 pylint/pyreverse/utils.py 中以位掩码实现模式含义位掩码PUB_ONLY过滤所有非 public 属性默认等价于PRIVATESPECIAL_SPECIAL _PROTECTED _PRIVATEALL不过滤显示全部成员0SPECIAL过滤 Python 特殊方法__xxx__但保留构造函数_SPECIALOTHER过滤 protected_x与 private__x属性_PROTECTED _PRIVATE底层由FilterMixIn与get_visibility配合工作get_visibility依据SPECIAL、PRIVATE、PROTECTED三个正则判断成员归属show_attr再通过self.__mode VIS_MOD[visibility]决定是否展示。模式名之间还可以用组合如-f SPECIALOTHER。祖先类--show-ancestors / --all-ancestors--show-ancestorsancestor 短选项 -a默认值None --all-ancestors 短选项 -A默认值None-a N显示不在指定projects内的祖先类最多 N 代-A显示projects中所有类的全部祖先无论其在不在项目内。从 diadefslib.py 的_set_default_options可见其内部换算all_ancestors为真时anc_level -1表示不限代数递归show_ancestorsN则anc_level N随后extract_classes会按代数递减递归收集祖先。若-a与-A同时给出-a的显式数值优先。关联类--show-associated / --all-associated--show-associatedassociation_level 短选项 -s默认值None --all-associated 短选项 -S默认值None-s N显示与目标类相关联、但不在projects内的类最多 N 层关联-S显示与目标类关联的所有类包括间接关联。关联的收集逻辑在get_associated中遍历Linker分析出的instance_attrs_type与locals_type把实例推断回其ClassDef后递归展开pylint/pyreverse/diadefslib.py。关联关系的具体判定则在 pylint/pyreverse/inspector.py 的AssociationsHandler中完成。内建与标准库--show-builtin / --show-stdlib--show-builtin 短选项 -b默认值False --show-stdlib 短选项 -L默认值False默认图中会跳过builtins模块与标准库模块的对象。DiaDefGenerator.show_node先检查node.root().name builtins由--show-builtin控制再用 astroid 的is_stdlib_module判断标准库归属由--show-stdlib控制pylint/pyreverse/diadefslib.py。开启后str、list、datetime等类型及其关系也会出现在类图中。深度限制--max-depth--max-depthdepth 默认值None限制图中包含的包/模块的最大深度深度相对最深层级的指定包计算--max-depth0只显示指定的包/模块本身--max-depth1额外包含其直接子级不指定显示层级中的所有包/模块。当同时指定了嵌套包时深度从最深的那一层算起。实现上DiaDefGenerator.__init__会用get_leaf_nodes找出参数中不是其他参数前缀的叶子节点pylint/pyreverse/diadefslib.py并以module.count(.)作为基准深度若传入的参数中存在非叶子节点会发出警告并仅以叶子节点为基准。每个节点由_should_include_by_depth依据absolute_depth - relative_depth max_depth判定是否纳入pylint/pyreverse/diadefslib.py。聚焦单类--class--classclass 短选项 -c默认值None可多次指定值为 CSV为指定类生成一张聚焦该类及其协作类的类图并默认启用-ASmy组合--all-ancestors、--all-associated、--module-namesy、--filter-modeALL之外的相应含义详见下文。当项目包含多个模块时类名需写成module.ClassName形式例如pyreverse -ASmy -c pylint.checkers.classes.ClassChecker pylint该命令除生成pylint的完整包图与类图外还会额外生成文件pylint.checkers.classes.ClassChecker.dot聚焦单个类的类图。其实现由ClassDiadefGenerator.class_diagram完成先用rsplit(., 1)拆出模块与类名再经module.ilookup(klass)解析出ClassDef节点最后以该节点为根递归抽取祖先与关联pylint/pyreverse/diadefslib.py。若无法推断出该类会给出警告并生成空图。多个-c可组合使用一旦指定了-c默认的包图类图就不再生成见 DiadefsHandler.get_diadefs。显示选项Display Options这组选项定制图的视觉外观标签形式、颜色方案与信息密度。模块名显示--module-names--module-namesy or n 短选项 -m默认值None是否在类名中带上所属模块前缀。注意它是三态的取y/n显式开关当值为None时DiaDefGenerator._set_option 会把默认值取为是否指定了-c聚焦单类时默认打开以便区分同名类。开启后get_title会输出module.ClassName形式。该选项对 MermaidJS 输出同样生效参见 变更记录。类框内容--only-classnames / --no-signatures--only-classnames 短选项 -k默认值False --no-signatures 默认值False-k类框内只显示类名不显示属性和方法文档明确说明这会禁用-f的取值效果。在 writer.get_class_properties 中体现为attrsNone, methodsNone--no-signatures方法只显示名称不带参数列表和返回类型注解。它通过 set_printer 里的show_signatures not self.config.no_signatures传给具体 Printer 实现。孤立节点--no-standalone--no-standalone 默认值False只显示有连接关系的节点孤立的类/模块从图中剔除。在 DiagramWriter.write_classes 与write_packages中节点只有出现在specialization/association/aggregation/composition类图或depends/type_depends包图任一关系两端时才会被emit_node。颜色--colorized / --color-palette / --max-color-depth--colorized 默认值False --color-palettecolor1,color2,... 默认值见下 --max-color-depthdepth默认值2--colorized启用彩色输出同一包下的类/模块使用同一种颜色--color-palette以逗号分隔的调色板用于按包深度着色。默认值是(#77AADD, #99DDFF, #44BB99, #BBCC33, #AAAA00, #EEDD88, #EE8866, #FFAABB, #DDDDDD)这一组 9 色在 main.py 中被注明为色盲友好的配色方案改编自 seaborn colorblind 调色板--max-color-depth2最多为 2 层包深度分配不同颜色更深层会循环复用颜色。着色逻辑在 writer.get_shape_color以qname()的前depth段作为包基准名首次出现的包从itertools.cycle(color_palette)取色并缓存到used_colors标准库对象固定使用灰色。输出控制Output Control输出格式--output--outputformat 短选项 -o默认值dot选择输出格式。pyreverse原生支持以下格式见 main.py 的 DIRECTLY_SUPPORTED_FORMATS 与 printer_factory.py 的格式-打印机映射格式对应打印机说明.dot/.gvDotPrinterGraphviz 原生 DOT 语言.puml/.plantumlPlantUmlPrinterPlantUML 文本.mmdMermaidJSPrinterMermaidJS 文本.htmlHTMLMermaidJSPrinter内嵌 MermaidJS 的 HTML 页面其他任何格式如png、svg、pdf等都会尝试调用 Graphviz 的dot命令行工具转换生成因此需要本机安装 Graphviz。转换流程dot_printer.py先写出 DOT 内容再通过tempfile.mkstemp(.gv, ...)生成临时.gv文件最后执行dot -T target tmp.gv -o output得到最终文件并清理临时文件。若选择的格式不在原生列表Run.init会先调用check_graphviz_availability()检查dot是否在PATH中不在则报错并以退出码 32 终止再调用check_if_graphviz_supports_format()用dot -T?探测 Graphviz 是否支持该格式pylint/pyreverse/utils.py。输出目录--output-directory--output-directoryoutput_directory 短选项 -d默认值指定输出文件的存放目录。值为空时文件写到当前工作目录若该目录已存在DiagramWriter.write会把文件名拼接到目录下pylint/pyreverse/writer.py。项目配置Project Configuration这组选项定义项目级别的解析行为。忽略文件--ignore--ignorefile[,file...] 默认值(CVS,)指定要跳过的文件或目录注意必须是基准名base name而非路径。默认忽略列表来自 constants.DEFAULT_IGNORE_LIST (CVS,)。它最终作为black_list传给 project_from_files在递归遍历包内文件时astroid.modutils.get_module_files(dirname, black_list)被过滤掉。项目名--project--projectproject name 短选项 -p默认值设置项目名它会追加到输出文件名上。在 writer.write 中输出文件名来自图的标题diagram.title如classes project_name会被规范化为classes_project_name形式因此-p myproj会得到类似classes_myproj.dot的文件名。源根目录--source-roots--source-rootspath[,path...] 默认值()向源根目录列表追加路径支持 glob 通配。源根目录可以是绝对路径也可以是相对当前工作目录的路径用于为位于其下的模块确定包命名空间。在 Run.run 中每个packages参数都会先经过discover_package_path(arg, self.config.source_roots)定位真实路径再统一放入augmented_sys_path后执行解析这保证了多源根/非常规布局项目也能正确找到模块。调试输出--verbose--verbose 默认值False让pyreverse输出更多信息主要用于调试。开启后_astroid_wrapper在解析每个模块前会打印parsing modname...pylint/pyreverse/inspector.py。从源码看 pyreverse 的完整执行链路把上面的选项串起来一次pyreverse运行的完整调用链如下依据 Run.rundiscover_package_pathaugmented_sys_path结合--source-roots定位并扩展模块搜索路径project_from_files用 astroid 解析每个包/模块--verbose在此生效--ignore作为black_list过滤文件--project作为项目名Linker(project, tagTrue)遍历 AST解析继承、关联、聚合、组合等关系pylint/pyreverse/inspector.pyDiadefsHandler.get_diadefs按--class生成聚焦类图否则由DefaultDiadefGenerator生成包图类图--filter-mode、--max-depth、--show-ancestors等在这里控制纳入范围pylint/pyreverse/diadefslib.pyDiagramWriter.write按--output选取 Printerprinter_factory.py按--colorized/--color-palette/--max-color-depth/--only-classnames/--no-signatures/--no-standalone渲染节点与边写入--output-directory指定的文件pylint/pyreverse/writer.py。此外pyreverse还支持一个隐藏在 utils.py 中的配置机制~/.pyreverserc。get_default_options()会在启动时读取该文件若存在insert_default_options()把其中的参数插入sys.argv从而实现无需每次敲命令行的默认参数注入。用测试验证配置行为仓库为上述配置行为提供了完整的单元测试支撑相关用例集中在 tests/pyreverse/test_diadefs.py覆盖祖先/关联层级、--max-depth深度限制、--class聚焦等过滤逻辑test_writer.py覆盖--colorized着色、--no-standalone、--only-classnames等渲染逻辑test_main.py校验各选项默认值如ignore_list默认(CVS,)与命令行解析行为test_printer.py 与 test_printer_factory.py验证dot/puml/mmd/html各打印机的输出与格式分派test_pyreverse_functional.py基于 tests/pyreverse/functional/ 下的.py .rc .dot/.puml/.mmd配对做端到端输出比对。实战建议快速预览项目结构pyreverse -o png -p myproj src需安装 Graphviz得到packages_myproj.png与classes_myproj.png聚焦核心类pyreverse -c mypkg.core.Service -o puml mypkg把协作关系单独成图压缩大项目图规模组合--max-depth2 --no-standalone -f PUB_ONLY同时配合--show-builtin/--show-stdlib按需放行内建与标准库类型嵌入文档用-o mmd或-o html输出 MermaidJS可直接放进 Markdown 或发布为独立 HTML团队统一默认参数把常用参数写入~/.pyreverserc例如一行一个选项--outputsvg --colorized --source-rootssrc。更多使用场景与输出示例可参阅 Pyreverse 总览 与 输出示例文中的完整选项清单始终以自动生成的 configuration.rst 为准。赞分享静态分析代码质量Lint开发工具【免费下载链接】pylintIts not just a linter that annoys you!项目地址https://gitcode.com/gh_mirrors/pyl/pylint点击查看免费下载相关推荐WarriorJS 命令行选项完全指南从 --directory 到 --yes 的实战配置详解WarriorJS 命令行选项完全指南从 directory 到 yes 的实战配置详解 本篇指南系统讲解 WarriorJS 命令 warriorjs 的全教育CLIimaginAIry 命令行 imagine 命令完全指南从文生图到 ControlNet、视频生成的实战手册imaginAIry 命令行 imagine 命令完全指南从文生图到 ControlNet、视频生成的实战手册 本指南以 imaginairy https:/AI 应用媒体生成PyInstaller pyi-makespec 完全指南从命令行选项到 spec 文件生成全解析PyInstaller pyi makespec 完全指南从命令行选项到 spec 文件生成全解析 导读 pyi makespec 是 PyInstaller开发工具构建工具上一篇如何快速上手 React-resizable-panels10分钟从零到精通下一篇G-Helper华硕笔记本轻量级控制工具告别Armoury Crate的臃肿体验创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询