为什么不能在python中将类属性命名为保留字?

Dan*_*lez 3 python reserved-words class-attributes

似乎保留字不能在python中用作属性:

$ python
Python 3.6.2 |Continuum Analytics, Inc.| (default, Jul 20 2017, 13:51:32) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> class A:
>>>     global = 3
  File "<stdin>", line 2
    global = 3
           ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

这似乎是明智的,因为它是模棱两可的:我在global这里使用关键字吗?很难说。

但这不是明智的恕我直言:

>>> class A: pass
>>> a = A()
>>> a.global = 3
  File "<stdin>", line 1
    a.global = 3
           ^
SyntaxError: invalid syntax
>>> a.def = 4
  File "<stdin>", line 1
    a.def = 4
        ^
SyntaxError: invalid syntax
>>> a.super = 5
>>> a.abs = 3
>>> a.set = 5
>>> a.False = 5
  File "<stdin>", line 1
    a.False = 5
          ^
SyntaxError: invalid syntax
>>> a.break = 5
  File "<stdin>", line 1
    a.break = 5
          ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

为什么会有这个限制?我不是在孤立地使用保留字,而是将其作为类属性:完全没有歧义。python为什么会在乎呢?

use*_*ica 5

这是不值得的。

当然可以。修改令牌解析器和解析器,以便令牌解析器了解解析上下文,并在解析器期望属性访问时发出NAME令牌而不是关键字令牌,或者只是在DOT之后始终发出NAME令牌而不是关键字。但是那会给你带来什么呢?

您将使解析器和令牌生成器更加复杂,从而更容易出现错误。对于人类读者来说,您会使事情变得更难阅读。您将限制将来使用语法的可能性。你会引起混乱

Foo.for = 3
Run Code Online (Sandbox Code Playgroud)

解析和

class Foo:
    for = 3
Run Code Online (Sandbox Code Playgroud)

引发SyntaxError。您会降低Python的一致性,学习难度和理解程度。

而且,所有这些,您将获得...的写作能力x.for = 3。我能说的最好的一点是,它可以防止x.fibble = 3在添加fibble关键字后就中断诸如此类的操作,但是即使那样,所有其他用途fibble仍然会中断。不值得。如果要使用疯狂的属性名称,请使用setattrgetattr


Python尽最大努力使语法简单。它的解析器是LL(1),并且LL(1)解析器的限制被认为是特别有益的,因为它们可以防止疯狂的语法规则过度使用

简单胜于复杂。这个想法扩展到了解析器。将Python的语法限制为LL(1)解析器是一种祝福,而不是诅咒。它使我们陷入束手无策的境地,这使我们无法过度学习并最终得到时髦的语法规则,例如一些其他不具名的动态语言,例如Perl。

某些东西x.for = 3与该设计理念不符。

  • 好的,这个解释很令人满意。我给人的印象是python在积极地执行此操作,而不是简单语法规则的直接结果。换句话说,我认为python会过度使用,以防止在特殊情况下使用保留字。相反,对我来说(不要过分考虑)对我来说很明智。 (2认同)