world.py:
""" A module for playing with the world. """ def destroy(): """Destroys the world.""" print("The world was destroyed!") def save(kind): """Saves a kind.""" print("All the", kind, "were saved.")
Искаме да ползваме горните функции в много програми, а не искаме да копираме кода във всяка от тях.
women.py:
import world world.save('women') world.destroy()
animals.py:
import world world.save('animals') world.destroy()
Работи без проблеми ако трите файла са в една директория. Чрез модули можем да използваме един и същи код много пъти (code reuse).
.
(точка)world.destroy()
destroy
е функция и е атрибут на обекта world
, който пък е модул>>> world <module 'world' from '/home/nb/py/world.py'> >>> world.destroy <function destroy at 0x00CA46F0>
dir
можем да видим всички атрибути на обект:>>> dir(world) ['__builtins__', '__doc__', '__file__', '__name__', 'destroy', 'save'] >>> world.__doc__ ' A module for playing with the world. ' >>> world.__name__ 'world'
import world def save_poohs(): world.save('Poohs') insane = True print(dir())
[<системни атрибути> 'world', 'save_poohs', 'insane']
import pooh import piglet def breakfast(): print("Is it already eleven?") pooh.breakfast() piglet.breakfast() breakfast()
Ако използваме модули няма нужда да се притесняваме, че в няколко програми сме използвали едни и същи имена.
answer = 42
answer
трябва да се търси по стандартния начин (в разните обхвати)pooh.naivete = 42
naivete
не трябва да се търси в стандартните обхвати, а трябва да се търси в списъка с атрибути на обекта зад името pooh
universe.milkyway.earth.europe.bg.beautify()
bottles = 1 def add_bottle(): global bottles bottles += 1
import mod bottles = 5 mod.add_bottle() print(bottles, mod.bottles)
import
С конструкцията import
можем да ползваме код от външни файлове.
Ето какво се случва, ако изпълним import mod
:
mod
се присвоява обекта на изпълнения модулimport mod
Всички по реда на претърсване: списъка sys.path
Търси се в:
PYTHONPATH
.pth
файловеimport
, само да дефинираме фукнциите сиdef eat(what): print(what, "was eaten.") if __name__ == '__main__': eat('The world as we know it')
$ python3 eater.py
The world as we know it was eaten.
>>> import eater
Представете си, че имаме две отделни системи, в които има модул на име game
system1/
game.py
<други модули>
system2/
game.py
<други модули>
Сега напишете система, която използва модулите game
и от двете системи:
import game game.play()
Тук вече имаме малък проблем.
Би било много удобно ако можехме да разделим двата модула game
в отделни пакети:
import system1.game import system2.game system1.game.play() system2.game.play()
Това е възможно при няколко условия:
system1
и system2
са някъде из пътя за търсене на python__init__.py
При import
на по-сложно име се извършва следното:
__init__.py
в неяПонякога е досадно да извикваме всеки път цялото име на някой обект, като universe.milkyway.earth.europe.bg.beautify()
from universe.milkyway.earth.europe.bg import beautify beautify()
Или даже:
from universe.milkyway.earth.europe.bg import beautify as b b()
Хубаво ли ви е така:
from mod import a,b,c,d,e,f,g,h,i,j,k,l
И на мен. Затова Python ни позволява да внесем в нашия модул всички имена от някой друг: from mod import *
_име
не се внасят__име__
не се внасятmod
има списък с име __all__
, то се внасят само имената съдържащи се в негоС пакети от модули можем с един замах да import-нем много модули: forest/pooh.py:
name = 'Pooh' pot = 'Full of honey'
forest/piglet.py:
name = 'Piglet' baloon = 'Red'
forest/__init__.py:
from . import pooh from . import piglet pot = pooh.pot baloon = piglet.baloon
user.py:
import forest print(forest.pooh.name) print(forest.piglet.name) print(forest.pot) print(forest.baloon)
import mod
— намира се модула и обектът му се присвоява на името mod
sys = '/usr/src/sys'
import os
def list_by_ext(path, ext):
return [d for d in os.listdir(path) if d.endswith('.'+ext)]
# искаме да отпечатаме sys.path
import sys
print(sys.path)
# сега да видим всички питонски файлове в /usr/src/sys
print(list_by_ext(sys, 'py'))
# опс:
TypeError: Can't convert 'module' object to str implicitly
модули в модули:
mod.py import sys >>> import mod >>> mod.sys
import sys as sysmod print(sysmod.path)
Почти същото е като:
import sys sysmod = sys del sys sysmod.path
само че ще загубим старата стойност на sys
import forest.pooh.name as pooh_name import forest.piglet.name as piglet_name
Съществува модул builtins
, който съдържа всички вградени функции и други имена:
import builtins builtins.dir = abs print(dir(-3))
Модулите се импортират само веднъж:
>>> import world >>> world.save('babas') All the babas were saved. >>> world.save = 5 >>> import world >>> world.save 5
За презареждане трябва да се ползва reload()
:
>>> world.save 5 >>> from imp import reload >>> reload(world) >>> world.save <function save at 0x015001F0>