繁体   English   中英

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

[英]What are all the ways to import modules in Python?

我做了一些研究,发现了以下文章: http : //effbot.org/zone/import-confusion.htm 虽然这似乎是一个很好的指南,但它写于 1999 年,不久前。 我正在使用 Python 3.4.3,所以我认为有些事情发生了变化,这让我很担心,因为我不想学习不适用的内容。 因此,在 Python 3 中,导入包和模块的所有方法是什么? 哪些方式是最常见的,应该优先于其他方式使用?

普通使用的唯一方法是该页面上列出的前三种方式:

  • import module
  • from module import this, that, tother
  • from module import *

这些在Python 3中没有改变。(有关Python查找要加载modulemodule.py文件的位置的一些细节已被调整,但导入本身的行为仍然如您链接的页面上所描述的那样工作。)

在Python 3之前添加了一件事,但是从那篇文章开始。 这是明确的相对进口。 这些让你做的事情from ..module import blah 这种导入只能在包内使用; 它允许包中的模块以相对于包的方式引用同一包中的其他模块(即,无需指定如何导入顶级包)。 您可以在PEP 328中阅读详细信息。 但是,即便如此,基本上只是您链接到的页面上提到的from module import blah style语法的新变体。

__import__也可以在Python 3中运行。这是一个内部函数,只有做一些不寻常的事情才需要使用。 这同样适用于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_name 保留命名空间我建议你可以从python3手册中看到几种导入方法,你可以通过重写__import__()方法或滚动你的方法来扩展它们。自己我会说坚持下去, 直到你有充分的理由不去

__import__()被双下划线包围的事实也是一个__import__()的提示。

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

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

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

虽然使用from module import *不是一个好习惯,但由于可读性:其他程序员无法理解当前模块中实际使用的内容。 内存过载:全部加载到内存中。 在模块中使用导入的最佳实践。

我认为导入为元组会更好的可读性最大线长度(pep8)

import语句有两个问题

  • 很长的导入语句可能很难编写,需要各种扭曲才能符合Pythonic风格指南。
  • 面对包装,进口可能含糊不清; 在一个包中,不清楚import foo是指包中的模块还是包外的某个模块。
  • golang语言golang有同样的golang

所以更喜欢导入有点这个

from package import (x, y)

而不是这个

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

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

假设您在 mypkg 包(包含init .py 文件的文件夹,它可以是一个空文件)中有 python 模块(mymod1.py、mymod2.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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM