以unicode字符串作为名称的namedtuple

Tho*_*mas 8 python unicode python-3.x python-collections

我在将unicode字符串指定为namedtuple的名称时遇到了麻烦.这有效:

a = collections.namedtuple("test", "value")
Run Code Online (Sandbox Code Playgroud)

这不是:

b = collections.namedtuple("??????????", "value")
Run Code Online (Sandbox Code Playgroud)

我收到了错误

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: '??????????'
Run Code Online (Sandbox Code Playgroud)

为什么会这样?文档说,"Python 3还支持在标识符中使用Unicode字符",关键是有效的unicode?

bob*_*nce 5

该问题特别是与字母?(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 ?