簡體   English   中英

連字符鍵的Python點表示法字典是否中斷?

[英]Python dot notation dict breaks for hyphenated keys?

我正在使用此處討論的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

因為“-”被視為減號操作而不是鍵名的一部分,所以此操作中斷了。 還有另一種方法來創建具有點式成員訪問權限的字典嗎?

ab在Python中不是有效的標識符。 有效的標識符可以由字母,數字和下划線( _ )組成。 變量名稱中的任何其他字符均不合法。

還有另一種方法來創建具有點式成員訪問權限的字典嗎?

沒有具有無效的標識符鍵點式訪問的方式

我不確定你為什么感到驚訝。 在JavaScript中,相同的表達式也會引發錯誤:

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

因此,就像在JavaScript中一樣,回退到:

>>> foo['a-b'] = 'ab'

這不可能直接實現。 最好的方法是允許混合訪問-就像您已經做的那樣-並​​使用它。 或者,也可以按照Not_a_Golfer的建議使用setattr()/getattr()

好吧,這是有可能的,但是您真的不想這樣做。

>>> class foo():
...    pass
... 
>>> f = foo()
>>> setattr(f, 'foo-bar', 1)
>>> getattr(f, 'foo-bar')
1

ab不是有效的標識符,但使用運算符-解釋為表達式。 您可以設置以下字段: setattr(foo, 'a-b', 'ab')

它可能不適合您要實現的慣用語,但是如果您要用下划線替換連字符,則代碼將起作用:

foo.a_b = 'ab'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM