Понимание импорта python
В процессе обучения Django и Python. Я не могу понять это.
(Пример Notes: "helloworld" - это имя моего проекта. В нем есть 1 приложение под названием "приложение".)
from helloworld.views import * # <<-- this works
from helloworld import views # <<-- this doesn't work
from helloworld.app import views # <<-- but this works. why?
Кажется, что строки # 2 и # 3 практически одинаковы. Почему функция # 2 не работает?
Изменить - добавлен источник двух файлов.
Вы можете распознать этот код из проекта Django Book (http://www.djangobook.com/en/2.0)
HelloWorld/views.py
from django.shortcuts import render_to_response
from django.http import HttpResponse, Http404
import datetime
def hello(request):
return HttpResponse("Hello world")
def current_datetime(request):
current_date = datetime.datetime.now()
return render_to_response('current_datetime.html', locals())
def offset_datetime(request, offset):
try:
offset = int(offset)
except ValueError:
raise Http404()
next_time = datetime.datetime.now() + datetime.timedelta(hours=offset)
return render_to_response('offset_datetime.html', locals())
def display_meta(request):
values = request.META.items()
values.sort()
path = request.path
return render_to_response('metavalues.html', locals())
HelloWorld/приложение/views.py
from django.shortcuts import render_to_response
def search_form(request):
return render_to_response('search_form.html')
def search(request):
if 'q' in request.GET:
message = 'You searched for: %r' % request.GET['q']
else:
message = 'You searched for nothing.'
return render_to_response('search_results.html', locals())
Ответы
Ответ 1
Импорт Python может импортировать два разных типа вещей: модули и объекты.
import x
Импортирует весь модуль с именем x
.
import x.y
Импортирует модуль с именем y
и контейнер x
. Вы ссылаетесь на x.y
.
Однако, создав его, вы создали эту структуру каталогов
x
__init__.py
y.py
Когда вы добавляете в оператор import, вы определяете конкретные объекты для вытягивания из модуля и перемещения в глобальное пространство имен
import x # the module as a whole
x.a # Must pick items out of the module
x.b
from x import a, b # two things lifted out of the module
a # items are global
b
Если helloworld - это пакет (каталог с файлом __init__.py
), он обычно не содержит никаких объектов.
from x import y # isn't sensible
import x.y # importing a whole module.
Иногда у вас будут объекты, определенные в файле __init__.py
.
Как правило, используйте "из импорта модуля x" для выделения определенных объектов из модуля.
Используйте import module
для импорта всего модуля.
Ответ 2
from helloworld.views import * # <<-- this works
from helloworld import views # <<-- this doesn't work
from helloworld.app import views # <<-- but this works. why?
# 2 и # 3 не совпадают.
Второй импортирует views
из пакета helloworld
. Третий импортирует views
из пакета helloworld.app
, который является подпакетом helloworld
. Это означает, что представления специфичны для ваших приложений django, а не для ваших проектов. Если у вас были отдельные приложения, как бы вы импортировали представления из каждого? Вы должны указать имя приложения, которое вы хотите импортировать, следовательно, синтаксис helloworld.app
.
Ответ 3
Как упоминалось в sykora, helloworld не входит в состав и сам по себе, поэтому # 2 не будет работать. Вам понадобится helloworld.py, соответствующим образом настроенный.
Я спросил об импорте пару дней назад, это может помочь:
Проложить путь импорта в Python, прямо и просто?