28.01.2015 Views

Tutorial Python - Starship

Tutorial Python - Starship

Tutorial Python - Starship

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!