Ներդրված մոդուլներ

Մենք արդեն գիտենք, որ Python-ի սկրիպտներն ու ծրագրերը կարող են զգալի չափով մեծանալ: Կոդն է՛լ ավելի չբարդացնելու, այն կոկիկ ու ընթեռնելի պահելու համար մենք կարող ենք մեր ծրագիրը կառուցելիս օգտագործել մոդուլներ և փաթեթներ (package): Python-ում մոդուլը պարզապես Python կոդ պարունակող ֆայլ է: Մոդուլները կարող են import անել այլ մոդուլներ, ինչի արդյունքում կստեղծվեն ներդրված մոդուլներ: Իսկ ահա փաթեթները (package) հնարավորություն են տալիս իրար հետ կապված մոդուլները կազմակերպել ֆայլային պանակներ (directory) հիերարխիայում:
Ենթադրենք՝ դուք խաղ եք մշակում և ձեռքի տակ ունեք տարբեր գործառույթներ, օրինակ՝ sound, level, character և այլն, որոնք բոլորը բաժանված են մոդուլների: Այսպիսով, sound մոդուլն ինքն ունի տարբեր բաղադրիչներ՝ effects, filters, echo և այլն: Այս դեպքում դուք կարող եք ստեղծել ներդիր մոդուլ: Եկեք հասկանանք՝ ինչպես.
Նախ, պետք է ստեղծել directory (folder) մեր փաթեթի համար: Օրինակ, մենք այն կարող ենք անվանել game.
game/                     # The directory of our game package
game directory-ի ներսում մենք ստեղծում ենք sound directory-ն և դատարկ __init__.py ֆայլը: __init__.py ֆայլի առկայությունը կարևոր է, քանի որ դրա շնորհիվ Python-ը հասկանում է, որ directory-ները պարունակում են փաթեթներ (package):
game/
    sound/                # Subdirectory for the 'sound' module
        __init__.py       # Makes Python treat 'sound' as a package
Այժմ մենք կարող ենք sound directory-ի ներսում ստեղծել տարբեր Python ֆայլեր՝ effects-ի, filters-ի և echo-ի համար: Այս ֆայլերից յուրաքանչյուրը ներկայացնում է sound մոդուլի ենթամոդուլը:
game/
    sound/
        __init__.py
        effects.py        # The 'effects' submodule
        filters.py        # The 'filters' submodule
        echo.py           # The 'echo' submodule
Ենթադրենք, effect.py-ն ունի հետևյալ տեսքը.
def echo_filter(soundwave):
    return soundwave + '...'   # Adds echo to the soundwave

def distort_filter(soundwave):
    return soundwave[::-1]     # Reverses the soundwave for distortion
Եթե մենք ցանկանում ենք օգտագործել այս ֆունկցիաները մեր game փաթեթի (package) մեկ այլ մոդուլում, մենք կարող ենք դրանք import անել: Մենք օգտագործում ենք կետ (.) փաթեթի (package) հետ աշխատելու համար: Դիտարկենք մեկ օրինակ՝ gameplay.py ֆայլում.
from game.sound.effects import echo_filter, distort_filter   # Importing the functions

soundwave = 'pew pew'
echoed = echo_filter(soundwave)
distorted = distort_filter(soundwave)

print(echoed, type(echoed))         # Prints 'pew pew...', <class 'str'>
print(distorted, type(distorted))   # Prints 'wep wep', <class 'str'>
Հիշե՛ք, որ Python լեզվով գրված կոդը մոդուլներով և փաթեթներով (package) կազմակերպելն օգնում է այն կոկիկ և ընթեռնելի պահել, ինչպես նաև հեշտացնում է կոդի պահպանումն ու դրա հետ հետագա աշխատանքը:

Init.py-ի դերը Python փաթեթներում (package)

Python-ում __init__.py ֆայլը ծառայում է հատուկ նպատակի այն directory-ների համար, որոնք դուք մտադիր եք օգտագործել որպես Python փաթեթներ (package): Որպես կանոն, Python-ի համար պահանջվում էր __init__.py ֆայլ, որպեսզի ծրագիրը directory-ն ճանաչի որպես մոդուլներ պարունակող փաթեթ (package): Սակայն Python-ի ավելի նոր տարբերակներում (3.3 և ավելի նոր) սա այլևս խիստ անհրաժեշտություն չէ:
Այդուհանդերձ, նույնիսկ այս փոփոխության դեպքում __init__.py ֆայլերը դեռևս մնում են կիրառության մեջ և որոշակի իրավիճակներում պահպանում են իրենց օգտակարությունը: Օրինակ՝ դրանք կարող են օգտագործվել փաթեթի (package) սկզբնավորման կոդը գործարկելու, import-ները __all__ փոփոխականով կառավարելու կամ հարմարավետ import-ներ սահմանելու համար։ Եկե՛ք դիտարկենք հետևյալ directory-ի կառուցվածքը.
game/
    __init__.py
    sound/
        __init__.py
        effects.py
        filters.py
        echo.py
game/sound/__init__.py-ում կարող ենք ունենալ.
from .effects import echo_filter
from .filters import distort_filter
from .echo import echo_sound
Այստեղ մենք ենթամոդուլները import ենք անում __init__.py ֆայլում: Երբ import անենք sound-ը, ուղիղ մուտք կունենանք effects, filters և echo ենթամոդուլներին: Այսպիսով, ծրագրի մեկ այլ մասում կարող էինք կատարել հետևյալը.
from game.sound import echo_filter, distort_filter

soundwave = 'pew pew'
echoed = echo_filter(soundwave)
distorted = distort_filter(soundwave)
Այս օրինակում __init__.py-ը կարևոր է տարբեր ենթամոդուլները միավորելու և գործառույթները import անելու համար պարզ ինտերֆեյս ապահովելու համար: Թեև Python-ի ավելի նոր տարբերակներում __init__.py-ի առկայությունը պարտադիր չէ, այս ֆայլը նման կերպ կիրառելու դեպքում կարող եք հեշտացնել ձեր փաթեթների (package) օգտագործումն ու կառավարումը:
 
To check your solution you need to sign in
Sign in to continue