2012-03-08 14 views
7

Który styl jest lepszy?import na poziomie modułu lub na poziomie funkcji?

Styl A:

def foo(): 
    import some_module 
    some_module.something 

Styl B:

import some_module 

def foo(): 
    some_module.something 

Załóżmy, że some_module nie jest używany w innym miejscu w kodzie, tylko wewnątrz tej funkcji.

Odpowiedz

15

Rzeczywiście, jak już wspomniano, zwykle najlepiej jest stosować się do zaleceń PEP 8 i importować je na samym szczycie. Są jednak wyjątki. Kluczem do ich zrozumienia jest osadzone pytanie w drugim akapicie: "na jakim etapie odbywa się import ...?"

Import jest w rzeczywistości instrukcją wykonywalną. Podczas importowania modułu wszystkie instrukcje wykonywalne w module działają. "def" jest również instrukcją wykonywaną; jego wykonanie powoduje, że zdefiniowana nazwa jest powiązana z (już skompilowanym) kodem. Więc jeśli masz:

def f(): 
    import something 
    return None 

w module importowanego, The (skompilowany) import i instrukcja powrotu dostać związane z nazwą „f” w tym punkcie. Kiedy wykonasz , wykonasz f(), wtedy zostanie uruchomiona instrukcja import.

Jeśli odroczysz importowanie czegoś, co jest "bardzo duże" lub "ciężkie", a następnie nigdy nie uruchamiasz tej funkcji (w tym przypadku f), import nigdy się nie dzieje. To oszczędza czas (i trochę miejsca). Oczywiście, gdy już zadzwonisz do f(), nastąpi import (jeśli już się to stało, gdy Python użyje wyniku z pamięci podręcznej, ale nadal musi to sprawdzić), abyś stracił przewagę czasową.

W związku z tym, z zasady, "importuj wszystko na wierzchu", aż do momentu, gdy wykonałeś wiele profilowań i odkryłeś, że importowanie "uścisku dłoni" marnuje dużo czasu w 90% twoich przebiegów, a oszczędzanie mało czasu w 10% z nich.

6

PEP 8 zaleca, aby cały import odbywał się w górnej części modułu. Wszystkie nazwy, w tym te związane z modułami, są wyszukiwane w lokalnych, nielokalnych, globalnych i wbudowanych zakresach, w tej kolejności.

+0

+1 dla PEP8. Moduł [pep8 module] (http://pypi.python.org/pypi/pep8) sprawdza twój kod przed wytycznymi PEP8. –

Powiązane problemy