【问题标题】:What is the most pythonic way to import modules in python在python中导入模块的最pythonic方法是什么
【发布时间】:2011-09-16 08:40:19
【问题描述】:

谁能建议我在 python 中导入模块的最 Pythonic 方式是什么? 让我解释一下——我已经阅读了很多 python 代码,发现了几种不同的方式来导入模块,或者更准确地说——何时导入:

  1. 使用一个模块/几个模块,其中包括整个项目所需的所有导入(第三方模块),因此所有导入都集中在几个模块中,因此易于维护导入。当任何单个模块需要导入任何模块时,它会要求引用模块。 例如,在我们的项目中,我们分离了名为“references”的级别,因此它包含诸如“system.py”(包含对所有系统库的引用)、“platform.py”(包含对所有平台库的引用)、“devexpress.py”之类的模块'(包含对所有 devexpress 库的引用)等等。这些模块看起来像:
  2. 每个模块在模块顶部导入所有必要的类和函数 - 例如。项目中的每个模块中都有一个导入部分
  3. 每个函数/类都在本地使用导入,例如在定义后立即导入它们真正需要的东西。

请在下面找到示例。

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的方式是什么?

【问题讨论】:

    标签: python python-import


    【解决方案1】:

    不要使用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
    

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

    【讨论】:

      【解决方案2】:

      人们已经对主要的风格问题发表了评论(在脚本顶部等),所以我会跳过。

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

      import os
      import system
      
      import twisted
      import zope
      
      import mymodule_1
      import mymodule_2
      

      【讨论】:

      • 我也是。我曾在公司级别的 PEP8 样式指南中工作,我们还决定在所有项目中必须使用相同的导入顺序。这种杠杆作用是 1)python 库(如 random、itertools 等)2)从引用模块导入 3)从核心模块导入 4)项目特定模块的导入和 5)导入模块特定模块
      【解决方案3】:

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

      import animals
      animals.Elephant()
      

      "from" 将一个 Python 模块加载到当前命名空间中,这样你就可以引用它而无需再次提及模块名称

      from animals import Elephant
      Elephant()
      

      from animals import *
      Elephant()
      

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

      因此,如果您有一个大型项目,您需要从其他模块导入许多不同的东西,最好使用 import 并将导入的东西与 module_name.your_class_or_function 一起使用。否则,使用 from 表示法...

      【讨论】:

      • 我同意 asterix('*') 是邪恶的。所以前段时间我仔细检查了我们所有的库并删除了所有 import * 语句。但是,我的问题与 import 语句的正确位置有关,而不是什么是最好的使用 import 或 from ... import... 感谢您的回复。
      • 星号不是邪恶的,只是需要小心使用。有一些库被设计为导入当前命名空间,例如 Tkinter。
      【解决方案4】:

      真的没关系,只要你不from ... import *。剩下的就是品味和解决循环进口问题。 PEP 8 声明您应该在脚本顶部导入,但即使这样也不是一成不变的。

      【讨论】:

      • 感谢您的回复。但是从代码可读性的角度来看,使用 1、2、3 有什么好处。哪个对大多数人来说更易读?
      • 顶部是最易读的,因为查看代码的人只需参考一个地方即可查看名称来自哪个包/模块。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 2015-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-09
      • 1970-01-01
      相关资源
      最近更新 更多