2014-04-25 12 views
5

mam zagłębiając wewnątrz kodu dla WiringPi-Python dla Pythona i znalazłem kilka bloków tak:Jaka jest różnica w obu tych instrukcjach Pythona?

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

ta jest nieco zastanawiające dla mnie, bo myślę, że w ten sposób:

def wiringPiSetup(): 
    return _wiringpi2.wiringPiSetup() 

przyniósłby dokładnie taki sam wynik jak ten:

wiringPiSetup = _wiringpi2.wiringPiSetup 

Wiem, że pierwszy deklaruje nową funkcję, a drugi jest odniesieniem t o oryginalną funkcję, ale w testach, które zrobiłem, stwierdzam, że są one całkowicie równoważne. Spójrz tutaj:

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

Dlaczego więc WiringPi-Python umieszcza oba, gdy jeden z nich będzie wystarczający?

BTW:

  • Używam Python 2.7.3
  • Jest to plik gdzie zobaczyłem, że: here
+3

Eh? Dobre pytanie, mam * nie mam pojęcia * dlaczego to robią. –

+0

Spróbuj usunąć jedną z opcji. Czy coś to psuje? – misha

+4

Pierwszą rzeczą, którą zauważam jest "Ten plik jest automatycznie generowany przez [swig] (http://www.swig.org/)", co może wyjaśniać pozornie bezcelowe stwierdzenie. Nigdy nie używałem SWIG i nie mam pojęcia, dlaczego generowałby taki kod. –

Odpowiedz

3

Plik jest generowany przez SWIG. Definicje funkcji są w rzeczywistości "martwym kodem", ponieważ można całkowicie usunąć definicję funkcji i po prostu pozostawić przydział w miejscu.

Ponieważ kod jest generowany automatycznie, kod jest nieco nieefektywny. SWIG function that generates this code, stwierdza:

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

więc drugie zadanie jest tam po prostu zastąpić wygenerowany funkcję Pythona, aby przyspieszyć wykorzystanie.

Jeśli funkcja ma dodatkowy kod Pythona do dodania podczas generowania (have_addtofunc() ma wartość true, jeśli występuje wartość docstring, a priori lub append), linia zastępcza nie jest generowana.

Prawdopodobnie pierwotna funkcja została pozostawiona na miejscu, dzięki czemu narzędzia automatycznego uzupełniania mogą korzystać z funkcji podpisu.

+0

3 sekundowa różnica w odpowiedzi na to pytanie. – vz0

+0

Niezłe badania, oboje! –

+0

Dzięki, wydaje się, że to jest poprawne. Zastanawiam się w każdym razie, jeśli jest to jedyny powód, żeby tam umieścić ten martwy kod. – MondKin

1

Ten plik został wygenerowany przez SWIG. Od odczytu SWIG Python generator soure code (emitFunctionShadowHelper) wydaje się, że generator kodu tworzy funkcję opakowania, jeśli funkcja opakowana ma jakieś docstring, ale wtedy, jeśli funkcja nie ma żadnego docstringu, generator kodu wydaje prostą instrukcję przypisania. Wygląda na to, że do tej funkcji można dodać klauzulę "else".

Powiązane problemy