Структура на файл/модул в Python

Така че тепърва започвам с Python и в момента си проправям път през http://diveintopython3.ep.io/. Примерите за код са хубави, но по-голямата част от тях са малки четириредови фрагменти и искам да видя малко повече от голямата картина.

Както разбирам - и ме поправете, ако греша - всеки '.py' файл става "модул", а група модули в директория става "пакет" (поне става, ако създам файл __init__.py в тази директория). Какво става, ако нямам __init__.py файл?

И така, как изглежда всеки "модулен" файл? Обикновено дефинирам ли само един клас във файла? Има ли нещо друго в този файл освен дефиницията на класа и може би няколко import команди?


person keithjgrant    schedule 13.01.2011    source източник


Отговори (3)


Какво става, ако нямам __init__.py файл?

Това е просто папка.

Обикновено дефинирам ли само един клас във файла?

Зависи. Не е задължително.

Има ли нещо друго в този файл освен дефиницията на класа и може би няколко команди за импортиране?

Можете да поставите всичко, което искате. Всичко, което е поне валиден python.

person Falmarri    schedule 13.01.2011
comment
Защо? Мислите ли, че е немислимо да имате модул, който е само един клас? - person Falmarri; 13.01.2011
comment
Имам доста модули, които изобщо не дефинират класове. Имам други, които дефинират някои свързани класове (и все още не надвишават 100, 150 реда). Python не е Java - класовете не са задължителни, така че не ги използвате, когато има по-добри опции (разбира се, същото важи и за всичко останало). - person ; 13.01.2011
comment
@Falmarri: не, просто защото от отговора на OP изглежда, че той проектира java дизайн на python, така че си помислих, че можете просто да кажете, че не е необходимо в python, казвайки зависи ми се струва, че ако му казваш, че можеш да програмираш на python като Java добре, просто синтаксис на изречението, нищо страшно, няма значение :) - person mouad; 13.01.2011
comment
И така, мога да направя модул bob, който е просто поредица от функции. За да използвам bob някъде другаде, аз import bob и след това достъп до тези функции като bob.func_one(), bob.func_two() и т.н.? Или нямам нужда от bob. пред имената на функциите? - person keithjgrant; 13.01.2011
comment
Ако направите import bob, тогава трябва да извикате всяка функция по начина, по който го споменахте: bob.func_one() и т.н. Ако направите : from bob import func_one, това импортира само func_one от bob и вие го извиквате директно: func_one() без префикса bob. - person user225312; 13.01.2011
comment
@keith: Правилно. Можете да избегнете префикса на пространството от имена, ако изрично изтеглите някои неща в текущото пространство от имена (from bob import func_one, func_two). Вие можете също да направите from bob import *, но това е силно обезсърчен. - person ; 13.01.2011
comment
А, това помага много. Не разбрах тази функционална разлика между пълен и частичен импорт. - person keithjgrant; 13.01.2011

Всъщност не е отговор, но винаги си струва да погледнете стандартната библиотека, за да видите как използват __init__.py в пакети като sqlite3 срещу модули като SimpleHTTPServer

person Andrew Cox    schedule 13.01.2011

Falmarri отговаря доста добре, но само да добавя:

__init__.py може да бъде празен файл (и обикновено е такъв), но може също така да изпълни инициализиращ код за пакета или да зададе __all__ променлива.

person user225312    schedule 13.01.2011
comment
Или можете да поставите целия си код в __init__. Или поставете кода, който искате да изложите. - person Falmarri; 13.01.2011
comment
Виждал съм също (и ми харесва, като потребител на библиотека) from pkg.subpkg import some, commonly, used, stuff така че import pkg вече ви дава повечето неща, от които се нуждаете. - person ; 13.01.2011