0

我正在使用此处讨论的 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-b不是 Python 中的有效标识符。有效标识符可以由字母、数字和下划线 ( _) 组成。任何其他字符在变量名中都是不合法的。

是否有另一种方法来创建具有点式成员访问权限的字典?

无法使用不是有效标识符的键进行点式访问。

于 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

这是不可能的。最好的方法是允许混合访问——就像你已经做的那样——并使用它。或者,setattr()/getattr()Not_a_Golfer 建议的那样,使用。

于 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 回答