在Python中导入模块的所有方法是什么?

在Python中导入模块的所有方法是什么?,python,import,python-import,Python,Import,Python Import,我做了一些研究,发现了以下文章:。虽然这似乎是一个很好的指南,但它是在1999年写的,一段时间前。我正在使用Python3.4.3,所以我认为有些事情已经改变了,这让我很担心,因为我不想学习不适用的东西。因此,在Python3中,详细介绍导入包和模块的所有方法是什么?哪些方法是最常见的,应该优先使用?对于普通使用来说,唯一重要的方法是该页面上列出的前三种方法: 导入模块 从模块导入这个,那个,到另一个 从模块导入* 这些在Python3中没有改变。(关于Python在何处查找要加载的modu

我做了一些研究,发现了以下文章:。虽然这似乎是一个很好的指南,但它是在1999年写的,一段时间前。我正在使用Python3.4.3,所以我认为有些事情已经改变了,这让我很担心,因为我不想学习不适用的东西。因此,在Python3中,详细介绍导入包和模块的所有方法是什么?哪些方法是最常见的,应该优先使用?

对于普通使用来说,唯一重要的方法是该页面上列出的前三种方法:

  • 导入模块
  • 从模块导入这个,那个,到另一个
  • 从模块导入*
这些在Python3中没有改变。(关于Python在何处查找要加载的
module.py
文件
module
的一些详细信息已经过调整,但导入本身的行为仍如您链接的页面所述。)

在Python3之前,但在那篇文章之后,添加了一件事。这是明确的相对进口。这些让您可以从..module import blah执行
之类的操作。这种进口只能在包装内使用;它允许包中的模块以与包相关的方式引用同一包中的其他模块(即,无需指定如何导入顶级包)。您可以在中阅读详细信息。尽管如此,这基本上只是链接到的页面上提到的
from module import blah
样式语法的一个新变体


\uuuuuuuuuuuuuuuuuuu导入
在Python3中仍然有效。这是一个内部函数,只有在做一些非常不寻常的事情时才需要使用。这同样适用于
importlib
模块(以及弃用的
imp
模块)中的各种功能。这些导入函数的精确魔法级别各不相同,但对于“我只想导入并使用此模块”的普通用法,基本上不需要使用它们。只有当您想动态导入一个直到运行时才知道名称的模块时,才需要它们。

Python的Zen为您提供了一些提示:

>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
因此,简单而明显的方法是:
import
module\u name它保留名称空间,我建议,尽管您可以从中看到多种导入方法,并且可以通过覆盖
\u import\u()来扩展它们
方法,或者通过滚动你自己的方法,我会说坚持使用它,直到你有一个好的理由不这样做

\uuuuu import\uuuuuu()
被双下划线包围的事实也是一个提示,不要管它


如果您希望了解导入机制背后的设计决策,那么从手册开始,然后进入PEP&这些都是很好的起点。

我们可以使用以下方法导入Python中的模块

  • 导入模块
  • 来自模块导入功能
  • 从模块导入*
尽管使用模块导入中的
*
这不是一个好的做法,因为可读性:其他程序员无法理解当前模块中实际使用的所有内容内存过载:所有内容都加载到内存中


我认为导入为元组对于可读性和

导入语句有两个问题

  • 长导入语句可能很难编写,需要各种 扭曲以符合肾盂式指导原则
  • 进口在包装上可能模棱两可;在一个包裹内, 不清楚
    import foo
    是指包内的模块还是包外的某个模块
  • golang
    语言也有同样的道理
所以我更喜欢这种进口方式

from package import (x, y)
而不是这个

from authentication.views import SignupView, LoginView, VerificationView, SignupDetailView

假设在mypkg包(包含init.py文件的文件夹,它可以是空文件)中有python模块(mymod1.py、mymod2.py文件,包含不同的函数)

以下是导入的不同方式:

from mypkg.mymod1 import *  #import all the function from mymod1 
add_fun(10, 20)
mul_fun(10, 2)

from mypkg.mymod1 import add_fun,div_fun  #import only needed functions from mymod1 
add_fun(10, 20)
div_mul(10, 2)

from mypkg import mymod1  #import mymod module
mymod1.add_fun(10, 20)
mymod1.mul_fun(10, 2)

import mypkg    #import package and use different models inside it
mypkg.mymod1.add_fun(10, 20)
mypkg.mymod1.mul_fun(10, 2)

@迈尔斯-更多关于相对进口的信息可以在下面找到:@BrenBarn好的,这很有意义。然而,我有一个特别的问题。我有一个包含两个模块的包。我在包外有另一个模块,我正在尝试访问包内两个模块的函数。在当前模块的顶部,我输入了
import package\u name
,但我仍然无法访问子模块中的功能。我做错了什么?@MilesDavis:你应该在这个网站上搜索类似的问题。如果你找不到答案,你应该问一个单独的问题,解释问题的细节。你在这里问了一个非常笼统的问题;如果您对特定设置有特定问题,则需要单独提问。
from mypkg.mymod1 import *  #import all the function from mymod1 
add_fun(10, 20)
mul_fun(10, 2)

from mypkg.mymod1 import add_fun,div_fun  #import only needed functions from mymod1 
add_fun(10, 20)
div_mul(10, 2)

from mypkg import mymod1  #import mymod module
mymod1.add_fun(10, 20)
mymod1.mul_fun(10, 2)

import mypkg    #import package and use different models inside it
mypkg.mymod1.add_fun(10, 20)
mypkg.mymod1.mul_fun(10, 2)