了解Python的导入[英] Understanding python imports

问题描述

在学习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不起作用?

编辑 - 添加了两个文件的来源. 您可以从django图书项目( 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/app/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())

推荐答案

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导入整个模块.

其他推荐答案

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是不是相同的.

第二个从软件包helloworld中导入views.第三个从软件包helloworld.app中导入的,这是helloworld的子包.这意味着视图是特定于您的Django应用程序的,而不是您的项目.如果您有单独的应用程序,如何从每个应用程序中导入视图?您必须指定要从中导入的应用程序的名称,因此语法helloworld.app.

其他推荐答案

正如Sykora所指的那样,Helloworld并不是本身的包裹,因此#2无法正常工作.您将需要一个适当设置的helloworld.py.

我询问了几天前进口的问题,这可能会有所帮助: 在python中布置导入路径>

本文地址:https://www.itbaoku.cn/post/637010.html