程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了标识符归一化:为什么微符号会转换为希腊字母mu?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

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

开发过程中遇到标识符归一化:为什么微符号会转换为希腊字母mu?的问题如何解决?下面主要结合日常开发的经验,给出你关于标识符归一化:为什么微符号会转换为希腊字母mu?的解决方法建议,希望对你解决标识符归一化:为什么微符号会转换为希腊字母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都是Llunicode组(小写字母)的一部分,因此它们都可以在标识符的任何位置使用。现在请注意,IDentifIEr实际上定义了xID_startxID_conTinue,并且将定义为相应非x定义中的所有字符,其NFKC规范化导致标识符的有效字符序列。

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

NFKC是Unicode规范化,可将字符分解为各个部分。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].encode()
b'\xce\xa9'
>>> 'Ω'.encode()
b'\xe2\x84\xa6'

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

唯一的问题是基于字符串的访问。字符串只是字符串,当然不会发生规范化(那将是一个坏主意)。此处显示的两种方式getattrlocals都对词典起作用。getattr()通过对象的访问对象的属性__Dict__,并locals()返回字典。而且在字典中,键可以是任何字符串,因此在其中带有MICRO SIGN或OHM SIGN是完全可以的。

在这些情况下,您需要记住自己执行标准化。我们可以利用unicodedata.normalize这一点,这也使我们能够正确地从内部获取价值locals()(或使用getattr):

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

解决方法

我偶然发现了以下奇怪情况:

>>> class Test:
        µ = 'foo'

>>> Test.µ
'foo'
>>> getattr(Test,'µ')
TraceBACk (most recent call last):
  File "<pysHell#4>",line 1,in <module>
    getattr(Test,'µ')
AttributeError: type object 'Test' has no attribute 'µ'
>>> 'µ'.encode(),dir(Test)[-1].encode()
(b'\xc2\xb5',b'\xce\xbc')

我输入的字符始终是键盘上的µ符号,但是由于某种原因,它会被转换。为什么会这样?

大佬总结

以上是大佬教程为你收集整理的标识符归一化:为什么微符号会转换为希腊字母mu?全部内容,希望文章能够帮你解决标识符归一化:为什么微符号会转换为希腊字母mu?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。