为什么在Python中无法将类属性命名为保留字?

丹尼尔·冈萨雷斯(Daniel Gonzalez)

似乎保留字不能在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为什么会在乎呢?

user2357112支持Monica

这是不值得的。

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

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

Foo.for = 3

解析和

class Foo:
    for = 3

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

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


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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在存在persistence.xml时将持久性单元命名为null

为什么Java程序员喜欢将变量命名为“ clazz”?

为什么将微服务分布式交易的模式命名为SAGA?

为什么在Python中将“ dir()”命名为“ dir”?

为什么将异常命名为选中和未选中?

为什么将Golang接口命名为“接口”?

为什么将提交按钮命名为“ submit”,我的表单却不提交?

为什么“ float”是JavaScript中的保留字?

人们为什么将文件命名为index.html?

ActiveAdmin:无法将模型命名为“操作”

为什么Angular JS被命名为Angular JS?

为什么案例类被命名为“案例”?

在VBA中实现接口时,为什么将参数重命名为RHS?

为什么将反应堆设计模式命名为反应堆?

与下划线实现方式无关,是否将checkmarx标记属性命名为“密码为中等漏洞”?

无法将控件重命名为我删除的控件

为什么将Ruby的悲观运算符命名为悲观?

为什么g ++ 10.1抱怨头文件中的命名为lambda而不抱怨?

为什么在node.js fs模块中删除文件被命名为“ unlink”?

为什么将docker pgadmin和postgres服务命名为“。\”?

为什么无法将文件从“ NAME”重命名为“ name”?

在Firebase中不一致地无法将键命名为整数

什么是“修复点”,为什么命名为“修复点”?

为什么不能将文件夹命名为“ ._。” 在Windows 7中?

为什么将Apache命名为Web服务器Apache和Tomcat?

为什么命名为“下划线”或“ lodash”?

Rxjava为什么Schedulers.trampoline()命名为“ trampoline”?

python将列中的字符串重命名为指定的字符串

为什么 Python 2、3 兼容包被命名为 `six`?