模块导入良好实践



什么是"良好实践";导入模块?例如,如果我有一个名为'module'的模块和一个名为'func'的函数,哪个更可取?

1:

def do_things():
from module import func
func()

2:

from module import func
def do_things():
func()
3:

import module as mod
def do_things():
mod.func()

4:

def do_things():
import module as mod
mod.func()

我需要确保我的代码为这个项目写得很好。此外,从模块中导入类(例如"from bs4 import BeautifulSoup")是否可以将它们导入到程序顶部的全局命名空间中?如果没有,是否也适用同样的规则?

在寻找最佳实践时,PEP8通常是首先要查找的地方。根据PEP8, #2: https://www.python.org/dev/peps/pep-0008/#imports

我也喜欢#3,但只是在某些情况下:

  • 如果它是一个广泛使用的软件包,如果经常缩写(例如import numpy as np)
  • 如果您要导入的包/函数的名称很长(例如import a_ridiculously_long_module_name as short_nameimport module.submodule.subsubmodule as short_name)

对未知包使用别名的危险在于缩写可能对您有意义,但对其他人没有意义。这会影响代码的可读性。

您还可以组合别名和绝对导入。选项5是:

from module import function as func

从性能的角度来看,importimport from完全相同。解释器将把整个模块加载到内存中。

那就留给你一个选择:用哪种方法去做。我会选择使代码更具可读性和更少歧义的代码:

  • 导入模块(别名或不别名)使用命名空间方法,这将避免两个模块具有相同名称的函数的情况。
  • 只导入你需要的函数可能会节省开发人员的认知负荷。

更新:关于本地进口,请看这个答案。Python将使用本地或顶部文件导入。本地导入可以避免循环依赖。一个更好的设计也可以帮助你做到这一点。

你必须选择你自己的毒药,这是一个权衡的问题。

我的观点是:

我更喜欢#3,我的理由是:

  1. from module import func不同,您可以在该模块中使用任何函数,而无需显式导入它。
  2. 更少的全局命名空间混乱(而不是from module import func1, func2, fun3,你可以只做import module as mod然后mod.func1()
  3. 在顶部导入意味着它可以在任何脚本中使用(如果你需要在以后的另一个函数中使用它,这样做更容易)。

对于导入单个类,如果这是您将对该模块做的唯一事情,我会发现ok,但我的观点1可以适用于这里,如果该模块还具有辅助函数和/或其他类,则最好导入模块然后执行module.Class()

相关内容

  • 没有找到相关文章

最新更新