[英]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.