2014-04-25 91 views
5

我裏面的代碼爲鑽研對於WiringPi-Python Python和我發現了幾個街區是這樣的:這兩個Python語句有什麼區別?

def wiringPiSetup(): 
    return _wiringpi2.wiringPiSetup() 
wiringPiSetup = _wiringpi2.wiringPiSetup 

這是一個令人費解的一點給我,因爲我認爲這:

def wiringPiSetup(): 
    return _wiringpi2.wiringPiSetup() 

將產生完全相同的結果如下:

wiringPiSetup = _wiringpi2.wiringPiSetup 

我知道第一個是聲明一個新函數,第二個是參考t原始功能,但在我做的測試中,我發現它們完全相同。看看這裏:

>>> def a(): 
...  return 4 
... 
>>> def a1(): 
...  return a() 
... 
>>> a2 = a 
>>> 
>>> a1() 
4 
>>> a2() 
4 

那麼,爲什麼WiringPi的Python把兩者當其中任何一個就足夠了?

BTW:

  • 我使用Python 2.7.3
  • 這是我看到的文件:here
+3

呃?好問題,我*不知道*他們爲什麼要這麼做。 –

+0

嘗試刪除其中一個選項。它會破壞什麼? – misha

+4

我注意到的第一件事是「這個文件是由[swig](http://www.swig.org/)自動生成的」,這可能會解釋看似毫無意義的說法。儘管我從未使用過SWIG,也不知道爲什麼它會生成這樣的代碼。 –

回答

3

該文件生成於SWIG。函數定義確實是「死代碼」,因爲您可以完全刪除函數定義,只是將賦值留在原地。

因爲代碼是自動生成的,所以代碼效率不高。該SWIG function that generates this code,指出:

if (Getattr(n, "feature:python:callback") || !have_addtofunc(n)) { 
    /* If there is no addtofunc directive then just assign from the extension module (for speed up) */ 
    Printv(f_dest, name, " = ", module, ".", name, "\n", NIL); 
} 

所以第二個任務是在那裏只需更換所產生的Python功能,加快使用。

如果該函數在生成時添加了額外的Python代碼(如果存在文檔字符串,前綴或附加值,則爲have_addtofunc()),則不生成替換行。

假定原始功能保留原位,以便自動完成工具可以使用功能簽名。

+0

回答這個問題有3秒的不同。 – vz0

+0

好的研究,你們倆! –

+0

謝謝,看來這是正確的。無論如何,如果這是讓那個死代碼在那裏的唯一原因。 – MondKin

1

此文件由SWIG產生。從閱讀SWIG Python generator soure codeemitFunctionShadowHelper)似乎代碼生成器創建一個包裝函數,如果包裝的函數有一些docstring,但如果該函數沒有任何docstring那麼代碼生成器發出一個簡單的分配語句。看起來像一個「else」子句可能被添加到該功能。