在python中导入模块的最pythonic方法是什么

时间:2011-06-16 12:52:57

标签: python python-import

任何人都可以建议我在python中导入模块的最pythonic方法是什么? 让我解释一下 - 我已经阅读了很多python代码,并找到了几种不同的方法来导入模块,或者更精确 - 何时导入:

  1. 使用一个模块/几个模块,其中包括整个项目所需的所有导入(第三方模块),因此所有导入都集中在少数模块中,因此很容易维护导入。当任何单个模块需要导入任何模块时,请询问参考模块。 例如,在我们的项目中,我们将名为'references'的级别分开,因此它包含'system.py'(包含对所有系统库的引用),'platform.py'(包含对所有平台库的引用)等模块,'devexpress.py' '(包含对所有devexpress库的引用)等。这些模块如下所示:
  2. 每个模块在模块顶部导入所有必需的类和函数 - 例如项目
  3. 中的每个模块中都有一个导入部分
  4. 每个函数/类在本地使用import,例如在定义之后,仅导入他们真正需要的东西。
  5. 请在下面找到样品。

    1个示例导入模块 - 只有'import'和'from ... import ...'语句(没有任何方法或类):

    #references.py
    import re
    import clr
    import math
    
    import System
    import System.Text.RegularExpressions
    import System.Random
    import System.Threading
    import System.DateTime
    
    # System assemblies
    
    clr.AddReference("System.Core")
    clr.AddReference("System.Data")
    clr.AddReference("System.Drawing")
    ...
    
    #test.py
    from references.syslibs import (Array, DataTable, OleDbConnection, OleDbDataAdapter,
                                     OleDbCommand, OleDbSchemaGuid)
    
    def get_dict_from_data_table(dataTable):
        pass
    

    2模块带'import'和'from ... import ...'以及方法和类:

    from ... import ...
    from ... import ...
    
    def Generate(param, param1 ...):
        pass
    

    3模块带有'import'和'from ... import ...'语句,这些语句在方法和类中使用:

    import clr
    clr.AddReference("assembly")       
    
    from ... import ...
    ...
    
    def generate_(txt, param1, param2):
      from ... import ...
      from ... import ...
      from ... import ...
    
      if not cond(param1): res = "text"
      if not cond(param2): name = "default"
    

    那么在python中导入模块的最pythonic方法是什么?

4 个答案:

答案 0 :(得分:13)

只要你没有from ... import * 真的无关紧要。其余的都是品味和解决循环导入问题。 PEP 8声明您应该在脚本的顶部导入,但即使这样也不是一成不变的。

答案 1 :(得分:5)

人们已经评论了主要的样式问题(在脚本的顶部等),所以我会跳过它。

对于我的导入,我通常按模块名称按字母顺序排序(无论是'import'还是'from ... import ...'。我将它分成以下组:标准库;第三方模块(来自pypi或其他);内部模块。

import os
import system

import twisted
import zope

import mymodule_1
import mymodule_2

答案 2 :(得分:3)

Python的“import”将Python模块加载到自己的命名空间中,因此您必须在导入模块中对任何名称的引用前添加模块名称后跟一个点

import animals
animals.Elephant()

“from”将Python模块加载到当前命名空间中,以便您可以引用它而无需再次提及模块名称

from animals import Elephant
Elephant()

from animals import *
Elephant()

使用from很好,(但使用通配符导入是令人沮丧的)。但是如果你有一个大规模的项目,从不同的模块导入可能会导致命名密集。就像从两个不同的模块导入 Elephant()函数一样会导致问题(例如使用带有 * 的通配符导入)

因此,如果您有一个大型项目,从其他模块导入许多不同的东西,最好使用导入并使用 module_name.your_class_or_function 导入的东西。否则,请使用符号......

答案 3 :(得分:3)

请勿使用from module import *。这将污染命名空间,并且非常不满意。但是,您可以使用from导入特定的东西; from module import something。这使命名空间保持干净。在较大的项目中,如果使用通配符,则可以将2 foo或2 bar导入同一名称空间。

PEP 8表示要在不同的行上进行导入。例如:

import os
import sys
import yourmodule
from yourmodule import specific_stuff

我做的一件事是将我的导入按字母顺序分为两组。一个是标准/第三方,第二个是内部模块。