了解python导入

时间:2009-05-23 01:04:11

标签: python django import

在学习Django和Python的过程中。我无法理解这一点。

(示例注释:'helloworld'是我项目的名称。它有一个名为'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不起作用?

编辑 - 添加了两个文件的来源。 您可能会从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())

3 个答案:

答案 0 :(得分:10)

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文件中定义对象。

通常,使用“from module import x”从模块中挑选特定对象。

使用import module导入整个模块。

答案 1 :(得分:4)

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

答案 2 :(得分:1)

正如sykora所提到的,helloworld本身并不是一个包,所以#2不起作用。你需要一个helloworld.py,进行适当的设置。

几天前我问过导入,这可能会有所帮助: Lay out import pathing in Python, straight and simple?