2014-04-25 9 views
5

Sto scavando all'interno del codice per WiringPi-Python per Python e ho trovato diversi isolati come questo:Qual è la differenza in queste due istruzioni Python?

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

Questo è un po 'sconcertante per me, perché penso che questo:

def wiringPiSetup(): 
    return _wiringpi2.wiringPiSetup() 

produrrebbe esattamente lo stesso risultato come questo:

wiringPiSetup = _wiringpi2.wiringPiSetup 

so che il primo è dichiara una nuova funzione, e il secondo è un riferimento t o la funzione originale, ma nei test che ho fatto trovo che sono totalmente equivalenti. Guardate qui:

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

Così, perché WiringPi-Python messo sia quando qualcuno di loro sarà sufficiente?

BTW:

  • sto usando Python 2.7.3
  • Questo è il file in cui ho visto che: here
+3

Eh? Bella domanda, non ho * idea * perché lo farebbero. –

+0

Prova a rimuovere una delle opzioni. Rompe qualcosa? – misha

+4

La prima cosa che noto è "Questo file viene generato automaticamente da [swig] (http://www.swig.org/)", che potrebbe spiegare l'affermazione apparentemente inutile. Non ho mai usato SWIG e non ho idea del perché genererebbe un codice del genere, però. –

risposta

3

Il file è generato da SWIG. Le definizioni delle funzioni sono in effetti "codice morto", in quanto è possibile rimuovere completamente la definizione della funzione e lasciare il compito in posizione.

Poiché il codice viene generato automaticamente, il codice è in qualche modo inefficiente. Il SWIG function that generates this code, afferma:

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); 
} 

così la seconda assegnazione è lì per sostituire solo la funzione Python generato per accelerare l'utilizzo.

Se la funzione dispone di codice Python aggiuntivo da aggiungere durante la generazione (have_addtofunc() è true quando è presente una docstring, un valore ante o un valore di append), la riga di sostituzione non viene generata.

Presumibilmente, la funzione originale viene lasciata sul posto in modo che gli strumenti di completamento automatico possano utilizzare la firma della funzione.

+0

3 secondi di differenza nel rispondere a questa domanda. – vz0

+0

Bella ricerca, entrambi! –

+0

Grazie, sembra corretto. Mi chiedo comunque se questa è l'unica ragione per lasciar entrare quel codice morto. – MondKin

1

Questo file fu generato da SWIG. Dalla lettura di SWIG Python generator soure code (emitFunctionShadowHelper) sembra che il generatore di codice crei una funzione wrapper se la funzione wrapped ha qualche docstring, ma se la funzione non ha docstring, il generatore di codice emette una semplice dichiarazione di assegnazione. Sembra che una clausola "else" possa essere aggiunta a quella funzione.