2012-05-03 21 views
5

To było pytanie do wywiadu, które zostało mi zadane. Proszę mnie nie karać, jeśli to nie ma sensu. Zapytała:jak zmienić funkcję w istniejącej bibliotece innej firmy w pythonie

"Mam istniejącą bibliotekę firm trzecich w pythonie i jest w niej funkcja foo() Jak mogę zmodyfikować tę funkcję po zaimportowaniu do mojego istniejącego modułu?"

+0

U góry mojej głowy użyj funkcji otoki. –

Odpowiedz

2

Nazywa się to łataniem małp. W skrócie, można po prostu przypisać do zmiennej sprawującego funkcję:

import existingmodule 

existingmodule.foo = lambda *args, **kwargs: "You fail it" 

To rzadko prawidłowa odpowiedź w praktyce. O wiele lepiej jest zawinąć coś za pomocą własnej funkcji lub dostarczyć własną implementację w innym miejscu lub użyć dziedziczenia (jeśli jest to metoda na klasie).

Jedynym powodem, aby to zrobić, jest to, aby zmienić zachowanie, które ma być odzwierciedlone w jego własnym kodzie (lub innym kodzie strony trzeciej); jeśli tak, sprawdź dobrze. Zwykle jest to lepsze podejście niż tworzenie własnego widelca; Powiedział, że dobrym pomysłem byłoby przesłanie kodu jako poprawki, więc nie jest to tylko wsparcie, jeśli jest akceptowane przez projekt.

1

Najczęstszym rozwiązaniem byłoby Monkey patching (Patrz: stackoverflow: what is monkey patching)

Na przykład:

>>> import os 
>>> os.listdir('.') 
['file_a', 'file_b'] 
>>> os.listdir = lambda folder: ['nothing in here, nope!'] 
>>> os.listdir('.') 
['nothing in here, nope!'] 

Było bardzo dobry talk na obiekcie w PyCon 2012, które można oglądać na youtube

Dyskusja daje również bardzo dobry przykład tego, gdzie łatanie małp może być przydatne: Powiedz, że masz bibliotekę innej firmy, która robi pewne rzeczy. Aby to zrobić, skrypt ten wymaga uruchomienia jako root, ale rzeczywista funkcjonalność nie wymaga uprawnień root'a. Teraz trzecia biblioteka może to sprawdzić pod numerem os.geteuid() == 0. Dzięki łataniu małp w kodzie korzystającym z tej biblioteki można zastąpić geteuid, aby udawać root'a, aby obejść to ograniczenie.

Używanie łatek dla małp to świetny sposób na szybkie naprawienie biblioteki. Złożenie raportu o błędzie i oczekiwanie na poprawkę może trochę potrwać, więc możesz pomóc sobie w ten sposób, bez wkopywania się do kodu źródłowego biblioteki.

+1

To nie jest "świetny sposób" na robienie czegokolwiek. Czasami jest to jedyny lub najmniej skomplikowany sposób na zrobienie czegoś. – Marcin

Powiązane problemy