似乎保留字不能在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
这似乎是明智的,因为它是模棱两可的:我在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
为什么会有这个限制?我不是孤立地使用保留字,而是将其作为类属性:根本没有歧义。python为什么会在乎呢?
这是不值得的。
当然可以。修改令牌解析器和解析器,以便令牌解析器了解解析上下文,并在解析器期望属性访问时发出NAME令牌而不是关键字令牌,或者只是在DOT之后始终发出NAME令牌而不是关键字。但是那会给你带来什么呢?
您将使解析器和令牌生成器更加复杂,从而更容易出现错误。对于人类读者,您将很难阅读。您将限制将来的语法可能性。你会引起混乱
Foo.for = 3
解析和
class Foo:
for = 3
引发SyntaxError。您会降低Python的一致性,学习难度和理解程度。
而且,所有这些,您将获得...的写作能力x.for = 3
。我能说的最好的一点是,它可以防止x.fibble = 3
在添加fibble
关键字后就中断诸如此类的操作,但是即使那样,所有其他用途fibble
仍然会中断。不值得。如果要使用疯狂的属性名称,请使用setattr
和getattr
。
Python尽最大努力使语法简单。它的解析器是LL(1),而LL(1)解析器的限制被认为是特别有益的,因为它们可以防止疯狂的语法规则过度使用:
简单胜于复杂。这个想法扩展到了解析器。将Python的语法限制为LL(1)解析器是一种祝福,而不是诅咒。它使我们陷入困境,这使我们无法过度学习并最终得到时髦的语法规则,例如一些其他未命名的动态语言,例如Perl。
某些东西x.for = 3
与该设计理念不符。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句