Python中导入模块的所有方式有哪些?

6
我进行了一些研究,发现了以下文章:http://effbot.org/zone/import-confusion.htm。虽然这似乎是一个很好的指南,但它是在1999年写的,已经有一段时间了。我正在使用Python 3.4.3,因此我认为有些东西已经改变了,这让我感到担忧,因为我不想学习无用的内容。因此,在Python 3中,有哪些导入包和模块的方法?哪些方法是最常见的,应该优先使用?
5个回答

4
在普通使用中,唯一重要的方式是该页面列出的前三种方式:
  • import module
  • from module import this, that, tother
  • from module import *
这些在Python 3中没有改变。(关于Python查找module.py文件以加载module的详细信息已经进行了微调,但导入本身的行为仍按照您链接的页面上描述的方式运作。)
在 Python 3 之前但自那篇文章以来,添加了一件事情。那就是显式相对导入。这使您可以执行诸如 from ..module import blah 的操作。这种导入只能从包内部使用;它允许包中的模块以相对于包的方式引用同一包中的其他模块(即,无需指定如何导入顶级包)。您可以在 PEP 328 中阅读详细信息。不过,即使如此,这基本上只是链接页面上提到的 from module import blah 样式语法的新变体。 __import__ 在 Python 3 中仍然可用。这是一个内部函数,只有在进行某些非常规操作时才需要使用它。对于 importlib 模块中的各种函数(以及已弃用的 imp 模块),同样适用。这些导入函数的巫术级别因函数而异,但对于普通的“我只想导入这个模块并使用它”的用法,你基本上永远不需要使用它们。只有当你想要做一些像动态导入运行时未知名称的模块之类的事情时,才需要使用它们。

1
@Miles - 关于相对导入的更多信息可以在以下链接中找到:https://dev59.com/y3VD5IYBdhLWcg3wJIAK - Dinesh Pundkar
@BrenBarn 好的,这很有道理。然而,我遇到了一个特定的问题。我有一个包含两个模块的包。我有另一个在包外的模块,并尝试访问包内两个模块中的函数。在我的当前模块顶部,我键入 import package_name,但我仍然无法访问子模块中的函数。我做错了什么? - Wesley
@MilesDavis:你应该在这个网站上搜索类似的问题。如果你没有找到答案,你应该提出一个单独的问题,解释你的问题的细节。你在这里问了一个非常普遍的问题;如果你有一个特定的设置问题,那就需要提出一个单独的问题。 - BrenBarn

3
Python之禅给出了一些提示:
>>> 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_name 并且 它保留名称空间,我建议在有多种导入方法的情况下,如Python3手册条目中所示,并且您可以通过覆盖 __import__() 方法或通过自己编写来扩展它们,我会说坚持使用它,直到您有一个充分的理由不这样做

事实上,__import__()被双下划线包围也是不要去碰它的提示。

如果您想了解导入机制背后的设计决策,请先从手册开始,然后再阅读PEPs302420是不错的起点。


1
我认为将导入作为元组会更有利于可读性和最大行长(pep8)
导入语句存在两个问题:
- 长的导入语句很难编写,需要各种扭曲的方式来符合 Pythonic 样式指南。 - 在处理包时,导入可能会产生歧义;在包内部,不清楚 import foo 是指包内的模块还是包外的某个模块。 - golang 语言也有同样的问题。
因此,我更喜欢这种导入方式。
from package import (x, y)

代替此内容
from authentication.views import SignupView, LoginView, VerificationView, SignupDetailView

https://legacy.python.org/dev/peps/pep-0328/


0
假设您拥有Python模块(mymod1.py,mymod2.py文件包含不同的函数)在mypkg包内(该文件夹具有 init .py文件,它可以是一个空文件)。
#mymod1.py
def add_fun(a,b):
    return a+b
def sub_fun(a,b):
    return a-b
def mul_fun(a,b):
    return a*b
def div_fun(a,b):
    return a/b

#mymod2.py
def fun1(...):
    ........
    ........
def fun2(...):
    ........
    ........

以下是导入的不同方式:

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)

0

我们可以使用以下方式在 Python 中导入模块

  • import module
  • from module import function
  • from module import *

虽然使用 from module import * 不是一个好的实践,因为可读性:其他程序员无法理解当前模块中实际使用了什么。 内存过载:所有内容都加载到内存中。 使用模块的最佳实践。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接