Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
De observat că atunci când se foloseşte sintaxa from packet import element, elementul poate fi, fie un submodul<br />
(sau subpachet), fie un nume definit în pachet, de exemplu un nume de funcţie sau variabilă, sau un nume<br />
de clasă.<br />
Instrucţiunea import testează întâi dacă elementul este definit sau nu în pachet. Dacă elementul nu este definit,<br />
<strong>Python</strong> presupune că este vorba de un modul şi încearcă să-l încarce. Dacă încărcarea nu reuşeşte este generată o<br />
excepţie de tipul ImportError.<br />
Când folosiţi o sintaxă de genul: import element.subelement.subsubelement, fiecare element, mai<br />
puţin ultimul trebuie obligatoriu să fie un pachet. Ultimul element poate fi un modul, un pachet, dar nu poate fi o<br />
clasă, o funcţie, o variabilă, etc. definită în elementul anterior.<br />
6.4.1 Importarea tuturor modulelor dintr-un pachet<br />
Ce se va întâmpla dacă un programator va folosi o instrucţiune de genul: from Sound.Effects import<br />
* Într-un caz ideal, programatorul ar putea să spere că interpretorul <strong>Python</strong> va realiza o căutare recursivă în<br />
sistemul de fişiere şi directoare după modulele existente în pachet. Din nefericire nu funcţionează foarte bine<br />
pe platforme Mac sau Windows, din varii motive. Pe astfel de platforme existenţa unui fişier ‘ECHO.PY’ nu<br />
garantează că în acest fişier se află un modul numit Echo, cât şi echo sau ecHo, şi aşa mai departe. Spre<br />
exemplu Windows 95 are prostul obicei de a afişa numele de fişiere cu prima literă mare. Sistemul de fişiere DOS<br />
8+3 ridică o altă piedică în calea numelor lungi de module.<br />
Singura soluţie pentru astfel de probleme este ca autorul pachetului să specifice exact ce module există în pachet.<br />
Instrucţiunea import() foloseşte următoarea convenţie: dacă codul existent în fişierul ‘__init__.py’ defineşte<br />
o listă cu numele __all__, aceasta este considerată lista cu modulele ce ar trebui încărcate la execuţia unei<br />
instrucţiuni from pachet import *. Este obligaţia autorului pachetului să modifice lista atunci când este<br />
cazul. Autorii de pachete pot lua, de asemenea, decizia de a nu defini această listă, dacă nu vor ca programatorul<br />
care foloseşte pachetul să execute instrucţiuni de genul import *. Fişierul ‘Sounds/Effects/__init__.py’ ar trebui<br />
să conţină următoarele:<br />
__all__ = ["echo", "surround", "reverse"]<br />
În acest caz instrucţiunea from Sound.Effects import * ar încărca cele trei submodule ale modulului<br />
Sound.<br />
Dacă variabila __all__ nu este definită, instrucţiunea de import nu va importa toate submodulele ci va importa<br />
numai pachetul Sound.Effects (eventual va executa codul de iniţializare din ‘__init__.py’) şi apoi va importa<br />
toate numele definite în pachet. Se vor importa şi submodulele pachetului dacă acest lucru este specificat prin<br />
instrucţiuni import. Priviţi următorul cod :<br />
import Sound.Effects.echo<br />
import Sound.Effects.surround<br />
from Sound.Effects import *<br />
În exemplul anterior, modulele echo şi surround sunt importate în spaţiul numeleor curent deoarec sunt definite în<br />
pachetul Sound.Effects când instrucţiunea from ...import este executată ( acest lucru funcţionează şi<br />
când se defineşte __all__).<br />
Nu este foarte eficient să folosiţi instrucţiuni de tipul import *, pentru că în acest fel codul dumneavoastră<br />
va deveni ambiguu, nefiind clar care anume module sunt încărcate. Totuşi dacă aţi lansat interpretorul în mod<br />
interactiv, puteţi folosi astfel de instrucţiuni pentru a evita scrierea multor instrucţiuni.<br />
În concluzie nu este nimic greşit în folosirea unei instrucţiuni similare cu from Packet import submodul,<br />
aceasta fiind şi sintaxa recomandată.<br />
6.4.2 Referenţieri între pachete<br />
Apare deseori necesitatea ca într-un submodul să se folosească cod dintr-un alt submodul. De exemplu modulul<br />
surround s-ar putea folosi de modulele echo. De fapt astfel de referinţe sunt atât de întâlnite încât instrucţiunea<br />
6.4. Pachete 43