我在分配unicode字符串作为namedtuple的名称时遇到麻烦。这有效:
a = collections.namedtuple("test", "value")
这不是:
b = collections.namedtuple("βαδιζόντων", "value")
我得到了错误
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python3.4/collections/__init__.py", line 370, in namedtuple
result = namespace[typename]
KeyError: 'βαδιζόντων'
为什么会这样?该文档说:“Python 3还支持在标识符中使用Unicode字符”,并且键是有效的unicode吗?
最佳答案
该问题特别与字母ό
(U + 1F79希腊小写字母omicron和oxia)有关。这是一个“兼容性字符”:Unicode宁愿您改用ό
(U + 03CC希腊小写字母omicron和tonos)。 U + 1F79仅存在于Unicode中,以便往返于可区分oxia和tonos的旧字符集,后来又发现这种区别是不正确的。
当您在标识符中使用兼容字符时,Python的源代码解析器会自动将它们标准化以形成NFKC,因此您的类名以U + 03CC结尾。
不幸的是collections.namedtuple
对此一无所知。它创建新类实例的方法是将给定名称插入字符串中的一堆Python代码中,然后exec
对它进行命名(真是的,对吗?),然后使用其名称从结果本地字典中提取该类...原始名称,而不是Python实际编译的规范化版本,因此失败。
这是collections
中的错误,可能值得一提,但是现在您应该使用规范字符U + 03CC ό
。
关于python - 具有unicode字符串作为名称的namedtuple,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30503539/