【问题标题】:What are all the ways to import modules in Python?在 Python 中导入模块的所有方法是什么?
【发布时间】:2015-11-22 16:09:09
【问题描述】:

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

【问题讨论】:

    标签: python import python-import


    【解决方案1】:

    对于日常使用而言,唯一重要的方式是该页面上列出的前三种方式:

    • 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 模块)中的各种功能。这些导入函数的准确程度因人而异,但对于“我只想导入此模块并使用它”的普通用法,您基本上不需要使用它们。仅当您想要执行诸如动态导入其名称直到运行时才知道的模块之类的操作时才需要它们。

    【讨论】:

    • @Miles - 有关相对进口的更多信息可以在下面找到:stackoverflow.com/questions/72852/…
    • @BrenBarn 好的,这是有道理的。但是,我遇到了一个特殊问题。我有一个包含两个模块的包。我在包外有另一个模块,并试图访问包内两个模块内的功能。在我当前模块的顶部,我输入import package_name,但我仍然无法访问子模块中的功能。我做错了什么?
    • @MilesDavis:你应该在这个网站上搜索类似的问题。如果你没有找到答案,你应该问一个单独的问题来解释你的问题的细节。你在这里问了一个非常笼统的问题;如果您对特定设置有特定问题,则需要单独提问。
    【解决方案2】:

    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 and 它保留了命名空间,我建议尽管您可以从python3 manual entry 并且您可以通过覆盖 __import__() 方法或滚动自己的方法来扩展它们,我会说坚持使用它直到你有一个好的理由不这样做

    __import__() 被双下划线包围的事实也暗示着不要管它。

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

    【讨论】:

      【解决方案3】:

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

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

      虽然使用from module import * 这不是一个好的做法,因为可读性: 其他程序员无法理解当前模块中实际使用的所有内容。 内存过载:全部加载到内存中。 Best practices for using import in a module.

      【讨论】:

        【解决方案4】:

        我认为作为元组导入会更好可读性Maximum Line Length(pep8)

        import语句有两个问题

        • 长导入语句可能难以编写,需要各种 扭曲以符合 Pythonic 风格准则。
        • 面对包,导入可能会模棱两可;在一个包裹内, 不清楚import foo是指包内的模块还是包外的某个模块。
        • golang 语言也有同样的功能

        所以更喜欢 import kinda this

        from package import (x, y)
        

        而不是这个

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

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

        【讨论】:

          【解决方案5】:

          假设您在 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)
          

          【讨论】:

            猜你喜欢
            • 2015-11-21
            • 2011-09-16
            • 1970-01-01
            • 1970-01-01
            • 2017-05-13
            • 1970-01-01
            • 2022-12-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多