Czy wytłumaczeniem może być fakt, że tej biblioteki będziemy używać
tylko w jednym miejscu, a skąd wiadomo, że za miesiąc nie będziemy
potrzebować jej w dwóch miejscach...
ot takie pytanie :-)
On Jan 7, 8:13 am, eliasz <eliasz.wont...@gmail.com> wrote:
> Chciałem zapytać czy importowanie zewnętrznych bibliotek (modułów,
> klas, funkcji) w kodzie programu tzn. w funkcjach, klasach - nie na
> początku "jest Python Way"? Czy nie zmniejsza to czytelności i
> jasności programu, gdy widzi się go po raz pierwszy (dla mnie
> zaciemnia trochę obraz).
Wedlug oficjalnego coding standardu PEP-8 [1] w paragrafie "Imports"
jest napisane:
"Imports are always put at the top of the file, just after any module
comments and docstrings, and before module globals and constants."
Czyli "Python Way" jest taki zeby importy dodawac na poczatku pliku.
[1] http://www.python.org/dev/peps/pep-0008/
Pozdrawiam,
Marcin
On Jan 7, 8:13 am, eliasz <eliasz.wont...@gmail.com> wrote:
> Chciałem zapytać czy importowanie zewnętrznych bibliotek (modułów,
> klas, funkcji) w kodzie programu tzn. w funkcjach, klasach - nie na
> początku "jest Python Way"? Czy nie zmniejsza to czytelności i
> jasności programu, gdy widzi się go po raz pierwszy (dla mnie
> zaciemnia trochę obraz).
W idealnym programie każdy moduł mieści się na jednej stronie :)
Generalnie popieram tę zasadę, ale jako nieortdoksyjny Pythonauta
dopuszczałbym pewne odstępstwa:
1. Rzadko wywoływane funkcje, które występują w dodatku w kilku
wersjach zależnych od platformy. W takim wypadku część z tych
funkcji nawet w ogóle nie będzie uruchamiana, więc spokojnie
importy modułów dedykowanych dla danej platformy (np. fcntl dla uniksa,
msvcrt dla windy) mogą się pojawić wewnątrz tych funkcji.
2. Cykliczne zależności między importowanymi modułami. Tu czasami
przesunięcie importu do wnętrza funkcji to jedyne wyjście:
http://effbot.org/zone/import-confusion.htm
RW
Dzięki za odpowiedź.
W moim przypadku zastanawiam się na użyciem funkcji __import__(). Bądź
co bądź będę znał wszystkie (swoje) moduły napisanego przeze mnie
programu, albo będzie ich ok. 50. Będzie 10 funkcji, które elastycznie
będą mogły działać na tych wszystkich modułach. Funkcje te wywoływane
są przez inny plik, który wrzuca odpowiedni moduł w zależności od
jakiś spełnionych lub nie warunków. Teraz czy importować te wszystkie
moduły w tym pliku i przekazywać je do funkcji, czy przekazywać jako
parametr do funkcji nazwę modułu jako string, a w samej funkcji
wykonać: __import__('name')?
(Z tego co wiem, nie będzie żadnych zmian w tej funkcji w Py3k, bo w
dokumentacji do 2.6.1 jest opisana - http://docs.python.org/library/functions.html)
eliasz napisał(a):
> Dzieki za odpowiedz.
> W moim przypadku zastanawiam sie na uzyciem funkcji __import__(). Badz
> co badz bede znal wszystkie (swoje) moduly napisanego przeze mnie
> programu, albo bedzie ich ok. 50. Bedzie 10 funkcji, ktore elastycznie
> beda mogly dzialac na tych wszystkich modulach. Funkcje te wywolywane
> sa przez inny plik, ktory wrzuca odpowiedni modul w zaleznosci od
> jakis spelnionych lub nie warunkow. Teraz czy importowac te wszystkie
> moduly w tym pliku i przekazywac je do funkcji, czy przekazywac jako
> parametr do funkcji nazwe modulu jako string, a w samej funkcji
> wykonac: __import__('name')?
Nie wiem jakie to sa warunki, ani na jakim etapie beda znane.
Jednak staralbym sie isc w kierunku jakiegos systemu pluginow, np.:
http://lucumr.pocoo.org/2006/7/3/python-plugin-system
Wtedy funkcje operowalyby na obiektach o ustalonym interfejsie
a implementacja zalezalaby od tego jaki modul zostal zaimportowany.
RW
Bardzo podoba mi się to podejście, spróbuję pójść w tym kierunku.
Chciałbym zapytać jeszcze o wydajność programu, w którym
1. mamy np. na początku zaimportowane 100 modułów
2. pobieramy 100 modułów w zależności od potrzeby (może być kilka razy
ten sam) funkcją __import__()
eliasz napisał(a):
> > Jednak staralbym sie isc w kierunku jakiegos systemu pluginow, np.:http://lucumr.pocoo.org/2006/7/3/python-plugin-system
> >
> > Wtedy funkcje operowalyby na obiektach o ustalonym interfejsie
> > a implementacja zalezalaby od tego jaki modul zostal zaimportowany.
>
> Bardzo podoba mi sie to podejscie, sprobuje pojsc w tym kierunku.
>
> Chcialbym zapytac jeszcze o wydajnosc programu, w ktorym
> 1. mamy np. na poczatku zaimportowane 100 modulow
> 2. pobieramy 100 modulow w zaleznosci od potrzeby (moze byc kilka razy
> ten sam) funkcja __import__()
Pierwszy `import` wrzuca referencje modulu do slownika `sys.modules`,
a kazdy nastepny sprawdza czy modul juz jest zaimportowany i dopiero
wtedy ewentualnie importuje.
Co do wydajnosci, to wszystko zalezy od tego jak wielkie sa te moduly,
w sensie jak dlugo zajmie ich kompilacja. Na ogół to nie jest problem
zwlaszcza, ze taka operacje wykonuje sie raczej rzadko w trakcie
dzialania
programu.
RW
> Pierwszy `import` wrzuca referencje modulu do slownika `sys.modules`,
> a kazdy nastepny sprawdza czy modul juz jest zaimportowany i dopiero
> wtedy ewentualnie importuje.
Czyli __import__ także umieszcza informacje w sys.modules i nie ma
konieczności z mojej strony robienie:
try:
obj = sys.modules[import_package]
except KeyError:
obj = __import__(import_package, {}, {}, [import_me])
except:
raise
print obj.__dict__[import_me]
bo i tak w __import__ jeszcze raz zostanie to zrobione?
eliasz napisał(a):
> On 8 Sty, 15:49, Rob Wolfe <r...@smsnet.pl> wrote:
>
> > Pierwszy `import` wrzuca referencje modulu do slownika `sys.modules`,
> > a kazdy nastepny sprawdza czy modul juz jest zaimportowany i dopiero
> > wtedy ewentualnie importuje.
>
> Czyli __import__ takze umieszcza informacje w sys.modules i nie ma
Nie tyle "takze", co funkcja `__import__` jest wywolywana przez
instrukcje `import` takze to prawie jedno i to samo.
http://docs.python.org/library/functions.html
> koniecznosci z mojej strony robienie:
> try:
> obj = sys.modules[import_package]
> except KeyError:
> obj = __import__(import_package, {}, {}, [import_me])
> except:
> raise
> print obj.__dict__[import_me]
>
> bo i tak w __import__ jeszcze raz zostanie to zrobione?
Tak, to jest zbedne, `__import__` to robi samodzielnie.
RW
Dziękuję bardzo za odpowiedzi.