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


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: нет, это просто потому, что из ответа ОП кажется, что он проецирует дизайн Java на 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
@кейт: Правильно. Вы можете избежать префикса пространства имен, если вы явно перетаскиваете некоторые вещи в текущее пространство имен (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