我是 python 编程的新手,python 的美妙之处在于一切都是对象,但为什么不将关键字作为对象?
>>> type(for)
File "<stdin>", line 1
type(for)
^
SyntaxError: invalid syntax
我是 python 编程的新手,python 的美妙之处在于一切都是对象,但为什么不将关键字作为对象?
>>> type(for)
File "<stdin>", line 1
type(for)
^
SyntaxError: invalid syntax
实际上,运算符是对象。看看operator
模块。您无法使用通常的名称获取运算符对象(因为这会使 Python 的语法变得非常复杂,并且令人困惑),但这有效:
>>> import operator
>>> type(operator.add)
<type 'builtin_function_or_method'>
流控制关键字,例如if
and for
are not objects,因为没有语义 - 你会用假设的for
对象做什么?请注意,有一些函数可以替换 for 循环,即filter
, map
,以及itertoolsreduce
中的各种函数。
运算符和关键字不是对象的原因是它们实际上只是语言语法的一部分,而不是您可以操作的元素。正如 phihag 所说,你会对假设的“for”对象做什么?
然而,运算符是对象——但您必须记住,“+”运算符本质上只是add函数的语法糖。当你写
a + b * c
Python 看到的(忽略优化)更像
a.__add__(b.__mul__(c))
事实上,我们可以用数字来试试这个:
>>> (5).__mul__((3).__add__(10))
65
因此,运算符“+”由 (5).__ add__ 函数表示,它是一个对象。(我们必须使用括号,因为数字文字是一种特殊的语法情况。)
有一些混合消息正在发生。Mark Pilgrim 说一切都是对象,但即使在一切都是对象的语言中,也不是一切都是对象。;)
Python 允许您通过类的特殊命名方法进行运算符重载。它也有一个operator
模块。归根结底,operator
模块的成员和特殊的运算符类方法都是函数,因此也是对象,但是 Python 用来提供可读性和语义的裸词(例如+
)并不总是可以作为对象进行解析。
这对于关键字来说不太正确。一些关键字,例如if
,根本不归结为一个对象。最好忽略Dive Into Python 中的一切,只记住这句话:
字符串是对象。列表是对象。函数是对象。甚至模块也是对象。
关键字在 Python 中并不存在。你得到一个语法错误,但如果你没有,你仍然不能做 type(keyword) 因为关键字不存在。
以下面的代码为例:
>>> from urllib2 import urlparse as foo
在这里,我们将“as”一词视为语法的一部分。这是一个关键字。
>>> type(as)
File "<stdin>", line 1
as
^
SyntaxError: invalid syntax
但是尝试将其用作对象会导致语法错误。
但在 2.4as
中不是保留字。所以有些不同:
>>> from urllib2 import urlparse as foo
到目前为止,一切都很好。
>>> type(as)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name 'as' is not defined
在那里,我们看到as
根本不存在。它不是一个对象,因为它什么都不是。语言不知道它的存在。这是因为语言在执行之前无法意识到某些事情。解析是在执行之前完成的。因此,语法和关键字的解析是在“一切”存在之前完成的。因此关键字不是“一切”的一部分,因此它们不是对象。
您得到的语法错误是为了防止您使用关键字作为变量名而犯错误。但是,在这种情况下,这个错误意味着关键字不是对象的原因并不是很明显:因为它们什么都不是。