Понимание импорта Python

В процессе изучения Django и Python. Я не могу понять это.

(Пример: «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/)

привет мир/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())

привет мир/приложение/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())

person T. Stone    schedule 23.05.2009    source источник
comment
Опубликовать фактический источник helloworld?   -  person    schedule 23.05.2009
comment
работает ли import helloworld.views как представления?   -  person SingleNegationElimination    schedule 23.05.2009
comment
у вас есть файл helloworld/__init__.py ?   -  person SingleNegationElimination    schedule 23.05.2009
comment
да, есть helloworld/__init__.py   -  person T. Stone    schedule 23.05.2009


Ответы (3)


Импорт Python может импортировать два разных типа вещей: модули и объекты.

import x

Импортирует весь модуль с именем x.

import x.y

Импортирует модуль с именем y и его контейнер x. Вы ссылаетесь на x.y.

Однако, когда вы его создали, вы создали эту структуру каталогов

x
    __init__.py
    y.py

Когда вы добавляете в оператор импорта, вы определяете конкретные объекты, которые нужно извлечь из модуля и переместить в глобальное пространство имен.

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 для импорта всего модуля.

person S.Lott    schedule 23.05.2009
comment
Таким образом, импортные представления helloworld лучше записывать как import helloworld.views ? Я понял это? - person T. Stone; 24.05.2009
comment
@Т. Стоун: Верно. Пример стандартной библиотеки — import os.path. - person S.Lott; 24.05.2009

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.

person sykora    schedule 23.05.2009

Как намекнул Сикора, helloworld сам по себе не является пакетом, поэтому № 2 не будет работать. Вам понадобится helloworld.py, правильно настроенный.

Я спросил об импорте пару дней назад, это может помочь: Проложить пути импорта в Python, прямо и просто?

person Community    schedule 23.05.2009