Python点符号dict打破带连字符的键?

时间:2012-05-21 10:36:27

标签: python

我正在使用Javascript风格的字典here。实现:

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.a-b会导致:

SyntaxError: can't assign to operator

这会中断,因为' - '被视为减号操作,而不是键名的一部分。是否有另一种方法来创建具有点式成员访问权限的字典?

6 个答案:

答案 0 :(得分:5)

a-b不是Python中的有效标识符。有效标识符可以包含字母,数字和下划线(_)。变量名中的任何其他字符都不合法。

  

是否有另一种方法可以使用点式成员创建字典   访问?

没有办法使用无效标识符的密钥进行点式访问。

答案 1 :(得分:4)

我不确定你为什么会感到惊讶。在JavaScript中,同一个表达式也会抛出错误:

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

所以,就像在JavaScript中一样,回到:

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

答案 2 :(得分:2)

这是不可能直接的。最好的方法是允许混合访问 - 正如您已经做的那样 - 并使用它。或者,也可以使用setattr()/getattr()作为Not_a_Golfer suggests

答案 3 :(得分:1)

嗯,这有点可能,但你真的不想这样做。

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

答案 4 :(得分:1)

a-b不是有效的标识符,但使用运算符-解释为表达式。您可以设置此类字段:setattr(foo, 'a-b', 'ab')

答案 5 :(得分:-1)

它可能不适合你想要达到的成语,但是如果你用下划线替换连字符,那么代码就可以了:

foo.a_b = 'ab'