任何人都可以建议我在python中导入模块的最pythonic方法是什么? 让我解释一下 - 我已经阅读了很多python代码,并找到了几种不同的方法来导入模块,或者更精确 - 何时导入:
请在下面找到样品。
#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
from ... import ...
from ... import ...
def Generate(param, param1 ...):
pass
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方法是什么?
答案 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
我做的一件事是将我的导入按字母顺序分为两组。一个是标准/第三方,第二个是内部模块。