Python对象的ϵ属性被静默转为ε是否属于预期行为?
Python中属性名ϵ通过点表达式被转换为ε的现象解析
这个现象是符合预期的,核心原因是Python对标识符的NFKC Unicode归一化处理规则:
- 使用点表达式(
.)创建或访问属性时,Python会自动将标识符转换为NFKC归一化形式。ϵ(U+03F5,希腊字母epsilon变体)在归一化后会被替换为ε(U+03B5,标准希腊字母epsilon),因此你通过a.ϵ = 100实际创建的是名为ε的属性。 setattr函数则直接使用传入的原始字符串作为属性名,不会触发自动归一化,因此可以成功创建并保留ϵ作为属性名。
相关文档依据
Python语言参考中关于标识符的定义明确说明:
解析标识符时,会将其转换为NFKC归一化形式。这表示某些视觉上不同的字符会被视为等价的标识符。
验证代码示例
Python 3.12.5 (main, Aug 7 2024, 13:49:14) [GCC 14.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> a = type('',(),{})() >>> a.ϵ = 100 >>> hasattr(a,'ϵ') False >>> hasattr(a,'ε') True >>> setattr(a,'ϵ',200) >>> hasattr(a,'ϵ') True >>> a.ϵ 100
内容的提问来源于stack exchange,提问作者Chun-Chung Chen
相关产品推荐
相关产品推荐

