2012-08-05 163 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根本不存在。這不是一個對象,因爲它不是什麼。該語言不知道它的存在。這是因爲語言在執行之前無法識別。解析在執行之前完成。因此,語法和關鍵字的解析在「一切」存在之前完成。因此關鍵字不是「一切」的一部分,因此它們不是對象。

您得到的語法錯誤是爲了防止您通過使用關鍵字作爲變量名稱來犯錯誤。不過,在這種情況下,這個錯誤意味着爲什麼關鍵字不是對象:因爲它們不是任何東西。

相關問題