Shadwing declaration

发布时间:2026/11/2 2:53:13

Shadwing declaration Shadwing declaration【免费下载链接】ruffAn extremely fast Python linter and code formatter, written in Rust.项目地址: https://gitcode.com/GitHub_Trending/ru/ruffShadow after incompatible declarations is OKdef _(flag: bool): if flag: x: str else: x: intx: bytes bfoo这份文档验证的是**在一个函数体内如果同一个变量 x 在 if/else 两个分支中分别被声明为 str 与 int即产生相互冲突的声明随后再以 x: bytes bfoo 进行新的带类型标注的声明ty 不会报错**。测试标题 Shadow after incompatible declarations is OK在不相容声明之后进行遮蔽是允许的直白地指出了断言结论该代码不应产生任何诊断。 值得注意的是该文档除 H1 标题Shadwing declaration原文拼写即如此与 H2 小节外不包含任何 # error: 或 # revealed: 断言注释——在 mdtest 语义中**没有断言即代表该测试期待零诊断**类型检查器必须接受这段代码。 ## 三、核心概念拆解声明 vs 赋值 要理解上述测试为什么「合法」必须区分 ty 内部的两个概念 1. **声明declaration**带类型标注的绑定如 x: str、x: bytes bfoo。声明是显式的类型契约类型检查器会将其写入 use-def 分析结果作为该位置后续引用的目标类型依据。 2. **赋值assignment**不带标注的绑定如 x 1。赋值会更新绑定值但不会修改已声明的类型契约。 在 [builder.rs](https://link.gitcode.com/i/f31a1de61be3a1dacc356ca5b30f80bf) 的 add_binding 方法中可以看到类型检查器处理「新绑定与已有声明」的底层逻辑 - 它从 use_def_map 取出该绑定对应的**声明集合**declarations_at_binding - 调用 place_from_declarations_with_reachability_cache 把这些声明合并成当前 place 的目标类型 - 若声明之间存在冲突会尝试报告 CONFLICTING_DECLARATIONS 诊断Conflicting declared types for {place}: ...源码注释里还留有 TODOpoint out the conflicting declarations in the diagnostic?。 也就是说**同一作用域内多个相互冲突的声明本身可能触发 Conflicting declared types 提示**——但这与本文主题并不矛盾mdtest 文档验证的是「在冲突声明之后**新增一个**遮蔽声明是合法的」即新的 x: bytes 声明不会被当作对既有声明的非法覆盖而报错。 ## 四、对照实验什么时候「遮蔽」会报错 同一主题下的其他 mdtest 文档给出了遮蔽的完整图景可用于对照理解 ### 4.1 隐式遮蔽不合法 在 [diagnostics/shadowing.md](https://link.gitcode.com/i/4304411bafc540460d921859e10219e5) 中用 # snapshot: 断言展示了隐式遮蔽会触发 invalid-assignment py class C: ... C 1 # snapshot: invalid-assignment对应诊断输出error[invalid-assignment]: Object of type Literal[1] is not assignable to class C info: Implicit shadowing of class C. Add an annotation to make it explicit if this is intentional函数同理def f(): ... f 1 # snapshot: invalid-assignmenterror[invalid-assignment]: Object of type Literal[1] is not assignable to def f() - Unknown info: Implicit shadowing of function f. Add an annotation to make it explicit if this is intentional结论用一个不带标注的赋值去覆盖类或函数的声明属于「隐式遮蔽」ty 会报invalid-assignment错误并附带 info 提示“如需有意为之请加上类型标注使其显式化”。4.2 显式遮蔽合法同样的场景只要加上类型标注就变成合法shadowing/class.mdclass C: ... C: int 1shadowing/function.md 中的「参数遮蔽」用例def f(x: str): x: int int(x)参数x被声明为str函数体内又重新声明为int并赋值——不产生任何诊断。这正与本文主题文档的结论互相印证显式声明带注解对既有声明的覆盖是类型检查器允许的遮蔽行为。4.3 def 声明的互相遮蔽shadowing/function.md 还指出def语句本身是声明因此一个def可以遮蔽另一个def也可以遮蔽先前的非def声明且不会报错f 1 reveal_type(f) # revealed: Literal[1] def f(): ... reveal_type(f) # revealed: def f() - Unknown f: int 1 reveal_type(f) # revealed: Literal[1] def f(): ... reveal_type(f) # revealed: def f() - Unknownreveal_type的输出随着每次新声明实时更新证明声明确实覆盖了此前的类型。4.4 属性赋值不适用遮蔽提示diagnostics/shadowing.md 中还有一个边界用例属性attribute赋值不触发遮蔽提示。对config.optionxform str这类属性写入ty 走的是属性赋值检查报告的是属性类型不匹配而不是「隐式遮蔽」from configparser import ConfigParser config ConfigParser() config.optionxform str # snapshot: invalid-assignmenterror[invalid-assignment]: Object of type class str is not assignable to attribute optionxform of type def optionxform(self, optionstr: str) - str五、遮蔽提示的源码实现遮蔽 info 提示的实现位于 types/diagnostic.rs 的report_invalid_assignment中当目标节点是ExprName即普通名字赋值且目标类型是类字面量或函数字面量时诊断追加一条 infoType::ClassLiteral(class) { diag.info(format_args!( Implicit shadowing of class {}. \ Add an annotation to make it explicit if this is intentional, class.name(context.db()), )); } Type::FunctionLiteral(function) { diag.info(format_args!( Implicit shadowing of function {}. \ Add an annotation to make it explicit if this is intentional, function.name(context.db()), )); }这一实现细节印证了 mdtest 快照中的提示文案也解释了为什么「加上注解」即可消除错误——注解会让该绑定从「赋值」升级为「声明」从而进入合法的显式遮蔽路径。六、如何在本地复现与扩展验证6.1 运行 mdtest所有 Markdown 测试均由 mdtest.rs 通过datatest_stable::harness!统一驱动root 为./resources/mdtest匹配所有.md文件。执行# 运行 ty_python_semantic 下全部 mdtest cargo test -p ty_python_semantic -- mdtest # 按文件名过滤到本文主题文档 cargo test -p ty_python_semantic --test mdtest -- shadowing也可使用带监视模式的 Python 运行器文件变更即自动重跑对应测试uv run crates/ty_python_semantic/mdtest.py6.2 修改/新增用例的建议复制 variable_declaration.md 到同一目录修改代码块内容即可得到新用例如需断言诊断使用行尾注释# error: [invalid-assignment]或# revealed: Literal[...]如需完整诊断快照使用# snapshot:行 紧随其后的【免费下载链接】ruffAn extremely fast Python linter and code formatter, written in Rust.项目地址: https://gitcode.com/GitHub_Trending/ru/ruff创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/2 2:53:12

LeetCode-Go 题解 771. Jewels and Stones:宝石与石头计数问题

LeetCode-Go 题解 771. Jewels and Stones:宝石与石头计数问题 【免费下载链接】LeetCode-Go ✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解 项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go 导读…

2026/10/30 9:01:45

工业数据集标准化全流程实战:从原始数据接入到质量验证

核数聚这个项目,说实话最开始并没有叫这么正式的名字。当时就是工厂给我们提了一个需求:要把设备监测、工艺参数、质检记录这些数据统一起来,做成一份"能喂给模型"的东西。等我把现场数据拉出来一看,才发现这事远比想象…

2026/11/2 12:46:48

Kali Linux常用命令速查:从文件操作到tar打包的避坑指南

简介:《Kali Linux 常用命令大全》面向刚接触Kali与Linux安全测试的学习者,也适合需要随手查阅基础命令的从业者,用于缓解命令多、用法散、排错时难以快速定位的问题。压缩包内仅含1个docx文档,体积约1.96MB,便于离线阅…

2026/11/2 12:46:48

Agent可观测性实战:从Token核算到链路追踪的排障指南

Agent 应用上线容易,上线之后怎么盯住它别跑偏,是另一回事。我最近帮一个团队排查生产事故,现象很典型:Agent 稳定运行一周后突然响应变慢,Token 账单翻了三倍,可 CPU、内存、带宽全都正常,日志…

2026/11/2 12:46:48

Linux下Qt命令行编译:qmake与cmake双路径实战指南

1. 项目概述:为什么命令行编译Qt项目不是“备选方案”,而是Linux开发者的日常呼吸在Linux环境下做Qt开发,很多人一上来就打开Qt Creator,点开项目、敲代码、点绿色三角运行——顺滑得像喝温水。但真正跑过三个以上中型Qt项目的人都…

2026/11/2 12:46:48

Attention机制原理与工程实践:从数学公式到医疗AI应用

1. 这不是魔法,是可计算的“聚焦力”:从人眼扫视到Transformer的注意力机制你有没有试过在嘈杂的餐厅里,只听清对面朋友说话的声音?或者翻一本厚书时,眼睛自动跳过页眉页脚,只锁定段落中的关键词&#xff1…

2026/11/2 12:46:48

栈结构在Unix路径简化中的应用与实践

1. 理解题目背景与需求 简化路径这道题源自Unix/Linux系统的文件路径处理场景。在实际开发中,我们经常需要处理各种复杂的文件路径,而规范化的路径对于文件操作、路径比较和系统安全都至关重要。 Unix风格的路径有几个关键特点: 以斜杠&quo…

2026/11/2 12:41:47

Codex与TencentDB Agent Memory集成的架构级冲突解析

1. 这不是“加个缓存”就能解决的问题:Codex 接入 TencentDB Agent Memory 的真实战场你有没有试过把 Codex 当成一个“智能胶水”,想把它粘在已有的 TencentDB Agent Memory 模块上,结果刚跑起来就报错——cc switch local proxy failed whi…

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

工业级SPI隔离设计:硬件抗扰与信号完整性实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

PLFM_RADAR:主动探测数据通道,构建低误报的数据感知系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

工业SPI隔离设计:MAX14431与STM32F746硬件抗干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑