Понимание импорта Python - PullRequest
3 голосов
/ 23 мая 2009

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

(Пример примечания: «helloworld» - это название моего проекта. В нем есть 1 приложение с именем «app».)

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 не работает?

Редактировать - добавлен источник двух файлов. Вы можете узнать этот код из проекта «Книга Джанго» (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())

Ответы [ 3 ]

10 голосов
/ 23 мая 2009

Импорт 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.

Как правило, используйте "from module import x", чтобы выбрать определенные объекты из модуля.

Используйте import module для импорта всего модуля.

4 голосов
/ 23 мая 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.

1 голос
/ 23 мая 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...