Get started learning Python with DataCamp's free Intro to Python tutorial. Learn Data Science by completing interactive coding challenges and watching videos by expert instructors. Start Now!

This site is generously supported by DataCamp. DataCamp offers online interactive Python Tutorials for Data Science. Join 11 million other learners and get started learning Python for data science today!

Good news! You can save 25% off your Datacamp annual subscription with the code LEARNPYTHON23ALE25 - Click here to redeem your discount

Модули и пакети


В програмирането модулът е част от софтуера, който има специфична функционалност. Например, при изграждане на игра на пинг-понг, един модул може да е отговорен за логиката на играта, а друг модул чертае играта на екрана. Всеки модул се състои от различен файл, който може да бъде редактиран поотделно.

Writing modules

Модулите в Python са просто Python файлове с разширение .py. Името на модула е същото като името на файла. Python модул може да има набор от функции, класове или променливи, които са дефинирани и имплементирани. Примерът по-горе включва два файла:

mygame/

  • mygame/game.py

  • mygame/draw.py

Python скриптът game.py имплементира играта. Той използва функцията draw_game от файла draw.py, или с други думи, draw модулът, който имплементира логиката за чертане на играта на екрана.

Модулите се импортират от други модули, като се използва командата import. В този пример, скриптът game.py може да изглежда нещо такова:

draw модулът може да изглежда нещо такова:

В този пример, game модулът импортира draw модула, което му позволява да използва функции, имплементирани в този модул. main функцията използва локалната функция play_game, за да стартира играта, и след това рисува резултата от играта, използвайки функция, имплементирана в draw модула, наречена draw_game. За да се използва функцията draw_game от draw модула, трябва да посочим в кой модул е имплементирана функцията, използвайки точковия оператор. За да реферираме draw_game функциите от game модула, трябва да импортираме draw модула и след това да извикаме draw.draw_game().

Когато import draw директивата се изпълни, Python интерпретаторът търси файл в директорията, в която е изпълнен скриптът, с името на модула и .py наставка. В този случай той ще търси draw.py. Ако е намерено, то ще бъде импортирано. Ако не е намерено, ще се продължи търсенето на вградени модули.

Може би сте забелязали, че при импортирането на модул се създава .pyc файл. Това е компилиран Python файл. Python компилира файловете в Python байткод, за да не се налага да анализира файловете всеки път, когато модулите се зареждат. Ако .pyc файлът съществува, той се зарежда вместо .py файла. Този процес е прозрачен за потребителя.

Импортиране на обекти на модула в текущото пространство от имена

Пространството от имена е система, в която всеки обект е наименован и може да бъде достъпен в Python. Ние импортираме функцията draw_game в пространството от имена на главния скрипт, използвайки командата from.

Може би сте забелязали, че в този пример името на модула не предшества draw_game, защото сме посочили името на модула, използвайки командата import.

Предимството на тази нотация е, че няма нужда да реферирате модула многократно. Въпреки това, едно пространство от имена не може да има два обекта с едно и също име, така че командата import може да замени съществуващ обект в пространството от имена.

Импортиране на всички обекти от модул

Можете да използвате командата import *, за да импортирате всички обекти в модул по следния начин:

Това може да бъде малко рисковано, тъй като промени в модула могат да засегнат модулът, който го импортира, но е по-кратко и не изисква да се посочва всеки обект, който искате да импортирате от модула.

Потребителско име за импортиране

Модулите могат да бъдат зареждани под каквото име желаете. Това е полезно при условно импортиране на модул за използване на едно и също име в останалата част от кода.

Например, ако имате два draw модула с леко различни имена, можете да направите следното:

Инициализация на модула

Първият път, когато модул се зарежда в изпълняващ се Python скрипт, той се инициализира чрез изпълнение на кода в модула веднъж. Ако друг модул във вашия код импортира същия модул отново, той няма да бъде зареден отново, така че локалните променливи в модула действат като "сингълтън", тоест се инициализират само веднъж.

След това можете да използвате това, за да инициализирате обекти. Например:

Разширяване на пътя за зареждане на модула

Има няколко начина да кажете на Python интерпретаторът къде да търси модули, освен по подразбиране в локалната директория и вградените модули. Можете да използвате променливата на средата PYTHONPATH, за да посочите допълнителни директории, в които да търсите модули като този:

Това изпълнява game.py и позволява на скрипта да зарежда модули от foo директорията, както и от локалната директория.

Можете също да използвате функцията sys.path.append. Изпълнете я преди да изпълните import командата:

Сега foo директорията е добавена към списъка с пътища, където се търсят модули.

Разглеждане на вградени модули

Вижте пълният списък на вградените модули в стандартната библиотека на Python тук.

Две много важни функции са полезни, когато разглеждаме модули в Python - функциите dir и help.

За да импортирате модула urllib, който ни позволява да четем данни от URL адреси, ние import модула:

Можем да потърсим кои функции са имплементирани във всеки модул, като използваме функцията dir:

Когато намерим функциите в модула, които искаме да използваме, можем да прочетем повече за тях с функцията help, използвайки Python интерпретатора:

Writing packages

Пакетите са пространства от имена, съдържащи множество пакети и модули. Те са просто директории, но със специфични изисквания.

Всеки пакет в Python е директория, която ТРЯБВА да съдържа специален файл, наречен __init__.py. Този файл, който може да е празен, указва, че директорията, в която се намира, е Python пакет. Така той може да се импортира по същия начин като модул.

Ако създадем директория, наречена foo, която отбелязва името на пакета, можем след това да създадем модул в този пакет, наречен bar. След това добавяме файла __init__.py в директорията foo.

За да използваме модула bar, можем да го импортираме по два начина:

или:

В първия пример по-горе, трябва да използваме префикса foo, когато достъпваме модула bar. Във втория пример не е необходимо, защото сме импортирали модула в пространството от имена на нашия модул.

Файлът __init__.py може също така да реши кои модули пакетът експортира като API, като запазва други модули вътрешни, като презаписва променливата __all__, както следва:

Упражнение

В това упражнение, отпечатайте азбучно сортиран списък на всички функции в модула re, съдържащи думата find.

import re # Your code goes here find_members = [] import re # Your code goes here find_members = [] for member in dir(re): if "find" in member: find_members.append(member) print(sorted(find_members)) test_object('find_members') success_msg('Great work!')

This site is generously supported by DataCamp. DataCamp offers online interactive Python Tutorials for Data Science. Join over a million other learners and get started learning Python for data science today!

Previous Tutorial Next Tutorial Take the Test
Copyright © learnpython.org. Read our Terms of Use and Privacy Policy