2012-08-05 165 views
1

我是新来的python编程,python的美丽是一切都是对象,但为什么没有关键字作为对象?python中的所有对象,但为什么没有关键字作为对象?

>>> type(for) 
    File "<stdin>", line 1 
    type(for) 
     ^
SyntaxError: invalid syntax 
+6

“一切都是对象”在Python中既不美丽也不真实。 – 2012-08-05 19:31:21

+0

有可能成为队长明显......但也许是因为他们是关键字和运营商,而不是对象? :)为什么你想让他们成为对象? – favoretti 2012-08-05 19:31:40

+2

*几乎*一切都有例外。 – 2012-08-05 19:37:13

回答

13

实际上,操作符是对象;看看operator模块。你不能与他们一贯的名操作员对象(因为这将显著复杂Python的语法,并会造成混淆),但这个工程:

>>> import operator 
>>> type(operator.add) 
<type 'builtin_function_or_method'> 

流量控制关键字,如iffor不是对象,因为没有语义 - 你会用假设的for对象做什么?请注意,有函数可以代替for循环,即filter,map,reduceitertools中的各种函数。

+0

我想'for'和'if'本来可以成为函数,但这可能需要一些没有人真正想要的语义体操。 – kojiro 2012-08-05 19:36:13

+0

@kojiro有一些常见的函数,你可以很容易地创建自己的函数,但结果不会很容易理解(大量的匿名函数),因此不是pythonic。 – phihag 2012-08-05 19:41:58

+1

“运营商”模块似乎是包装内置运营商的便利功能,而不是运营商自己。不确定这一点。 – 2012-08-05 19:43:17

1

有一些混合消息正在进行。 Mark Pilgrim说Everything is an Object,但即使在所有语言都是对象的情况下,也不是,所有内容都是对象。 ;)

Python允许您通过专门命名的方法对类进行操作符重载。它也有一个operator模块。不过说到底,的operator模块和特殊操作者类方法两个构件是功能,因此对象,但裸字(如+),该Python使用以提供可读性和语义是根本不总是可解析作为对象。

这对于关键字来说不太正确。有些关键字(如if)根本不归结为对象。这也可能是最好的忽略词一切在深入Python和只记得这句话:

字符串是对象。列表是对象。函数是对象。即使是 模块也是对象。

1

操作符和关键字不是对象的原因是它们实际上只是语言的语法的一部分,而不是您可以操作的元素。正如phihag所说,你会用一个假设的'for'对象来做什么?

但是,操作符是对象 - 但是您必须记住,'+'操作符基本上只是语法糖,用于添加函数。当你写

a + b * c 

什么Python看到(忽略优化)更像

a.__add__(b.__mul__(c)) 

事实上,我们可以用数字试试这个:

>>> (5).__mul__((3).__add__(10)) 
65 

因此,运营商+ '由(5).__ add__函数表示,这是一个对象。 (我们必须使用括号,因为数字文字是一种特殊的句法情况。)

+2

它比语法糖多一点点;观察'(2).__ add __('')'。 – phihag 2012-08-05 21:18:21

0

关键字在Python中不存在。你会得到一个语法错误,但如果你没有,你仍然不能键入(关键字),因为关键字不存在。

以下面的代码为例:

>>> from urllib2 import urlparse as foo 

在这里,我们看到这个词“是”作为语法的一部分。这是一个关键字。

>>> type(as) 
    File "<stdin>", line 1 
    as 
    ^
SyntaxError: invalid syntax 

但尝试使用它作为一个语法错误的对象的结果。

但是在2.4 as不是保留字。所以有不同的事情:

>>> 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根本不存在。这不是一个对象,因为它不是什么。该语言不知道它的存在。这是因为语言在执行之前无法识别。解析在执行之前完成。因此,语法和关键字的解析在“一切”存在之前完成。因此关键字不是“一切”的一部分,因此它们不是对象。

您得到的语法错误是为了防止您通过使用关键字作为变量名称来犯错误。不过,在这种情况下,这个错误意味着为什么关键字不是对象:因为它们不是任何东西。

相关问题