9

名前付きタプルの名前として Unicode 文字列を割り当てるのに問題があります。これは機能します:

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 ですか?

4

3 に答える 3

1

すでに受け入れられている回答がありますが、私に提供させてください

問題の修正

# coding: utf-8
import collections
import unicodedata


def namedtuple_(typename, field_names, verbose=False, rename=False):
    ''' just like collections.namedtuple(), but does unicode nomalization
        on names
    '''

    if isinstance(field_names, str):
        field_names = field_names.replace(',', ' ').split()
    field_names = [
        unicodedata.normalize('NFKC', name) for name in field_names]
    typename = unicodedata.normalize('NFKC', typename)

    return collections.namedtuple(
        typename, field_names, verbose=False, rename=False)


βαδιζόντων = namedtuple_('βαδιζόντων', 'value')

a = βαδιζόντων(1)

print(a)
# βαδιζόντων(value=1)
print(a.value == 1)
# True

それは何をするためのものか?

このnamedtuple_()実装を使用すると、 に渡す前に名前が正規化されcollections.namedtuple()、一致する名前を持つことが可能になりました。

これは @R に関する詳細です。名前を事前に正規化するという Martinho Fernandes のアイデア。

于 2015-05-28T11:42:28.447 に答える