繁体   English   中英

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

[英]What is the most pythonic way to import modules in python

任何人都可以建议我在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方法是什么?

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

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

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

import os
import system

import twisted
import zope

import mymodule_1
import mymodule_2

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

PEP 8表示在不同的生产线上进口。 例如:

import os
import sys
import yourmodule
from yourmodule import specific_stuff

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

暂无
暂无

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

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