栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

标识符归一化:为什么微符号会转换为希腊字母mu?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

标识符归一化:为什么微符号会转换为希腊字母mu?

这里涉及两个不同的字符。一个是MICRO
SIGN
,它是键盘上的一个,另一个是GREEK
SMALL LETTER MU

要了解发生了什么,我们应该看一下Python如何在语言参考中定义标识符:

identifier   ::=  xid_start xid_continue*id_start     ::=  <all characters in general categories Lu, Ll, Lt, Lm, Lo, Nl, the underscore, and characters with the Other_ID_Start property>id_continue  ::=  <all characters in id_start, plus characters in the categories Mn, Mc, Nd, Pc and others with the Other_ID_Continue property>xid_start    ::=  <all characters in id_start whose NFKC normalization is in "id_start xid_continue*">xid_continue ::=  <all characters in id_continue whose NFKC normalization is in "id_continue*">

我们的两个字符MICRO SIGN和GREEK SMALL LETTER
MU都是

Ll
unipre组(小写字母)的一部分,因此它们都可以在标识符的任何位置使用。现在请注意,
identifier
实际上定义了
xid_start
xid_continue
,并且将定义为相应非x定义中的所有字符,其NFKC规范化导致标识符的有效字符序列。

Python显然只关心标识符的 标准化 形式。确认如下:

解析时,所有标识符都转换为标准形式NFKC;标识符的比较基于NFKC。

NFKC是Unipre规范化,可将字符分解为各个部分。MICRO
SIGN分解为GREEK SMALL LETTER MU,这就是那里正在发生的事情。

还有许多其他字符也受此规范化影响。另一个例子是OHM
SIGN,它分解为GREEK
CAPITAL LETTER
OMEGA。将其用作标识符会产生相似的结果,此处使用locals显示:

>>> Ω = 'bar'>>> locals()['Ω']Traceback (most recent call last):  File "<pyshell#1>", line 1, in <module>    locals()['Ω']KeyError: 'Ω'>>> [k for k, v in locals().items() if v == 'bar'][0].enpre()b'xcexa9'>>> 'Ω'.enpre()b'xe2x84xa6'

因此,最后,这只是Python要做的事情。不幸的是,没有真正好的方法可以检测到此行为,从而导致出现如图所示的错误。通常,当标识符仅被称为标识符,即像真实变量或属性一样使用时,一切都会好起来的:每次都运行规范化,然后找到标识符。

唯一的问题是基于字符串的访问。字符串只是字符串,当然不会发生规范化(那将是一个坏主意)。此处显示的两种方式

getattr
locals
都对词典起作用。
getattr()
通过对象的访问对象的属性
__dict__
,并
locals()
返回字典。而且在字典中,键可以是任何字符串,因此在其中带有MICRO
SIGN或OHM SIGN是完全可以的。

在这些情况下,您需要记住自己执行标准化。我们可以利用

unipredata.normalize
这一点,这也使我们能够正确地从内部获取价值
locals()
(或使用
getattr
):

>>> normalized_ohm = unipredata.normalize('NFKC', 'Ω')>>> locals()[normalized_ohm]'bar'


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/650891.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号