有的python內置函數怎麼就一個pass?


你看到的是pass,但可能現實並非如此。

火車上信號太差了,待我移動一下再續……

先隨便扯扯吧……

既然提到Python內置函數的實現,就涉及到Python本身的實現方式了,也就是這個解釋器是怎麼實現的。

Python的解釋器有c java python等多種實現,一般情況下只要不搞些奇怪的操作,c語言實現的CPython就能滿足幾乎所有要求,這也是官方提供的默認實現。

因此就假設使用的是CPython咯,那麼作為解釋器標準實現的一部分,那些個內置函數也是用c語言實現的,也就是說,正常情況下你是連pass也看不到的。

PyCharm這個IDE做了一些66的事情,他會維護一個對當前解釋器中所有函數 類型等東西的索引,這樣就可以進行定義跳轉一類的操作了。但是對內置函數來說,找不到對應的實現,只有文檔 pydoc 可用,於是PyCharm就根據文檔自動地生成這些函數的簽名,也就是內容為pass的函數。

這些函數的具體實現需要到python的源代碼中找,可以參考官方文檔extending python with c(差不多是這個名字),看看c寫的東西是怎麼被python使用的。

另外PEP484的特性似乎可以讓自動生成的代碼包含參數類型和返回值類型(大概不能)

先扯這麼多吧,火車上用手機打字腿都麻了……


這種函數叫做鉤子(Hook),常用於模板模式(template pattern),作用是給類或者對象的方法提供一個默認行為,而子類可以複寫這個函數提供更加複雜的邏輯。

當然 pass 的用法不止這些,歡迎補充。pass 存在的原因是因為 python 是縮進排版的語言。想一想在你接觸的以括弧結束的語言中,提供一個空函數是很常見的需求吧?這時候只要給函數叫一對括弧就可以。而 python 不行,因此要提供一個關鍵字 pass


你看到的只是用來生成文檔和給靜態分析工具看的假代碼,這些函數的真正實現在解釋器里,一般看不到源代碼(特地去下載源碼來看不算,這裡指的是一般的發行版)


當你寫一個函數或者在類裡面寫方法時,如果你暫時還沒想好怎麼實現,可以暫時用一個pass來代替

class Person:
def eat(self):
pass

def cry(self):
print ("I"m crying")

如果你什麼都不寫的話,就會報錯

IndentationError: expected an indented block

高票回答說是給子類複寫這個函數提供更加複雜的邏輯,我認為不太合理,這種場景應該由抽象類來實現

class Person:
def eat(self):
raise NotImplementedError

def cry(self):
print ("I"m crying")

現在如果子類沒有實現 eat 方法,那麼直接報錯

不過這種情況只有在程序運行,該方法被調用才知道有異常,更加優雅的方式是程序啟動就告訴你該方法在子類中還沒有被實現。

import abc
class Person:
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def eat(self):
"""im not implements currently"""

def cry(self):
print ("I"m crying")


Python的pass語句主要用作:

1. 佔位符/槽點,比如你想要寫一個函數/方法,但是還沒想好怎麼寫,留待後面再考慮時,就在定義函數/方法時,在函數/方法體中加個pass,否則這個空函數/方法解釋執行不了會報錯。pass其實就是說:「通過,我啥也不做」。因為Python的縮進風格,不可能像其他語言比如JavaScript那般定義一個空函數:let fun = function() {};。P.S. 我個人感覺縮進風格真的不太好。

2. 另外,當然還有一些其他的作用,比如有時候我會類似這樣用:

for letter in "Go od Go o d Stu dy S tud y .":
if letter == " ":
pass
else:
print(letter, end="");

感覺從結構上來說比以下來得易懂直觀:

for letter in "Go od Go o d Stu dy S tud y .":
if not letter == " ":
print(letter, end="");

多寫一點點代碼也不會咋樣,但更匹配人的思維。當然,代碼風格也要看個人口味的啦。

3. 在子類繼承中覆寫使用,比如以下IPython代碼片段:

4. 忽略一些類型的Exception:

try:
...
except SomeException:
pass


先佔個坑,保證程序不報錯,等以後有時間再寫......然後就忘記了


推薦閱讀:

想知道大家都用python寫過哪些有趣的腳本?
python網頁爬蟲是非法的嗎?
如何利用python登錄知乎頁面?
去哪可以找到幫忙開發爬蟲的呢?
python 爬蟲 ip池怎麼做?

TAG:Python | Python庫 | Python開發 |