【问题标题】:Python dot notation dict breaks for hyphenated keys?Python dot notation dict 是否会为连字符键中断?
【发布时间】:2012-05-21 10:36:27
【问题描述】:

我正在使用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.a-b 会导致:

SyntaxError: can't assign to operator

这会中断,因为“-”被视为减号操作,而不是键名的一部分。还有其他方法可以创建具有点式成员访问权限的字典吗?

【问题讨论】:

  • 可以使用 setattr/getattr hacks 来实现,但是您不想这样做,并且会阅读您的代码的人也不希望您这样做。 (当然你不会获得点式成员访问权限)
  • -1 因为这在javascript中也无效。

标签: python


【解决方案1】:

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

有没有另一种方法来创建带有点样式成员的字典 访问?

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

【讨论】:

  • 它将被python的解释器视为((foo.a)-(b)) = ('ab'),这是非法的,因为表达式不能是左值。
【解决方案2】:

我不知道你为什么感到惊讶。在 JavaScript 中,同样的表达式也会抛出错误:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          它可能不符合您想要实现的习惯用法,但如果您将连字符替换为下划线,则代码可以正常工作:

          foo.a_b = 'ab'
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-02-24
            • 2019-11-07
            • 2021-09-13
            • 2021-08-18
            • 2023-02-10
            • 2022-12-02
            • 1970-01-01
            • 2016-02-29
            相关资源
            最近更新 更多