Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Python: Общие вопросы > Import statment |
Автор: fell 4.4.2009, 18:40 |
добрый денек Не так давно изучаю питон и django в частности. Вопрос такой,в теории по книжкам import работает у нас так - import module.attribute или from mudule import attribute, где модуль у нас обычно файл с расширением py, в котором может быть атрибут (класс или метод) нужный нам. Изучая django обнаружил такой вызов модуля from django.http import HttpResponse, что по идее должно было бы означать модуль http атрибут( метод, класс) HttpResponse. Модуль должен быть по идее файлом, который лежит в дире django, то есть http.py Пошел смотреть модуль (файл) ничего нет, метод HttpResponse обнаружился в файле __init__.py в папке http. Это какая то метода использовать классы в файле __init__.py ? почему не создать файл http.py и обозначить данные классы в нем, как это должно быть в теории ? |
Автор: fell 4.4.2009, 21:15 |
я знаю о существовании пакетов, но что значит на перспективу ? не все же эксперты, есть соглашение о том, что модуль это файл, давайте придерживаться этого соглашения. |
Автор: pythonwin 5.4.2009, 06:01 |
сделали пакет http в котором есть только один файл, чтобы потом добавить другие модули в этот пакет и не вызвать у программистов использующих этот пакет паники и необходимости переписывать их программы |
Автор: fell 5.4.2009, 11:05 |
а почему не добавить модули в этот же файл ![]() Вот у начинающих программистов точно возникнет паника, когда ожидаешь увидеть модуль, а его нет. Причем лезешь в книжку и там нет ответа на вопрос - вроде бы модули в файлах должны быть. А файл __init__.py имеет свое предназначение: Package initialization The first time Python imports through a directory, it automatically runs all the code in the directory’s__init__.py file. Because of that, these files are a natural place to put code to initialize the state required by files in the package. For instance, a package might use its initialization file to create required data files, open connections to databases, and soon. Typically, __init__.py files are not meant to be useful if executed directly; they are run automatically when a pack- age is first accessed. так же module namespace initialization, from * statement behavior Посколько он выполняются автоматически при доступе к пакету, этим и пользуются, чтобы запихать туда все нужные классы. Имхо это не очень хорошая практика. |
Автор: Brainerazer 10.4.2009, 18:24 |
Лучше было бы сделать так: http | | |---__init__.py |---http.py init.py: from http import * Если это, конечно, будет работать ![]() |