0

here で説明されているように、Javascript スタイルの辞書を使用しています。実装:

class DotDict(dict):
    def __getattr__(self, attr):
        return self.get(attr, None)
    __setattr__= dict.__setitem__
    __delattr__= dict.__delitem__

私はこの構造をしばらく問題なく使用してきましたが、最近、次のようにハイフンでつながれたキーを持つ辞書が必要になりました。

    foo = DotDict()
    foo.a = 'a'        #Business as usual
    foo.a-b = 'ab'     #Broken

foo.ab に割り当てると、次のようになります。

SyntaxError: can't assign to operator

これは、'-' がキー名の一部としてではなくマイナス演算として認識されるため、壊れます。ドット スタイルのメンバー アクセスで辞書を作成する別の方法はありますか?

4

6 に答える 6

6

a-bPython では有効な識別子ではありません。有効な識別子は、文字、数字、およびアンダースコア ( _) で構成できます。その他の文字は変数名に使用できません。

ドット スタイルのメンバー アクセスで辞書を作成する別の方法はありますか?

有効な識別子ではないキーでドット形式のアクセスを行う方法はありません。

于 2012-05-21T10:37:54.340 に答える
5

なぜあなたが驚いているのか分かりません。JavaScript では、同じ式でもエラーがスローされます。

>>> foo.a-b = 'ab'
ReferenceError: invalid assignment left-hand side

したがって、JavaScript と同様に、次のようにフォールバックします。

>>> foo['a-b'] = 'ab'
于 2012-05-21T10:46:14.293 に答える
2

それは直接的な方法では不可能です。最善の方法は、既に行っているように、混合アクセスを許可して使用することです。または、代わりに、Not_a_Golfer が示唆するように を使用setattr()/getattr()ます

于 2012-05-21T10:40:24.297 に答える
1

まあ、それはある程度可能ですが、あなたは本当にそれをしたくありません.

>>> class foo():
...    pass
... 
>>> f = foo()
>>> setattr(f, 'foo-bar', 1)
>>> getattr(f, 'foo-bar')
1
于 2012-05-21T10:40:07.693 に答える
1

a-bは有効な識別子ではありませんが、演算子 を使用した式として解釈されます-。ただし、そのようなフィールドを設定できます。setattr(foo, 'a-b', 'ab')

于 2012-05-21T10:41:05.980 に答える
-1

達成しようとしているイディオムには合わないかもしれませんが、ハイフンをアンダースコアに置き換えると、コードは機能します。

foo.a_b = 'ab'
于 2012-05-21T18:12:48.113 に答える