什么是"良好实践";导入模块?例如,如果我有一个名为'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_name
或import module.submodule.subsubmodule as short_name
)
对未知包使用别名的危险在于缩写可能对您有意义,但对其他人没有意义。这会影响代码的可读性。
您还可以组合别名和绝对导入。选项5是:
from module import function as func
从性能的角度来看,import
和import from
完全相同。解释器将把整个模块加载到内存中。
那就留给你一个选择:用哪种方法去做。我会选择使代码更具可读性和更少歧义的代码:
- 导入模块(别名或不别名)使用命名空间方法,这将避免两个模块具有相同名称的函数的情况。
- 只导入你需要的函数可能会节省开发人员的认知负荷。
更新:关于本地进口,请看这个答案。Python将使用本地或顶部文件导入。本地导入可以避免循环依赖。一个更好的设计也可以帮助你做到这一点。
你必须选择你自己的毒药,这是一个权衡的问题。
我的观点是:
我更喜欢#3,我的理由是:
- 与
from module import func
不同,您可以在该模块中使用任何函数,而无需显式导入它。 - 更少的全局命名空间混乱(而不是
from module import func1, func2, fun3
,你可以只做import module as mod
然后mod.func1()
。 - 在顶部导入意味着它可以在任何脚本中使用(如果你需要在以后的另一个函数中使用它,这样做更容易)。
对于导入单个类,如果这是您将对该模块做的唯一事情,我会发现ok,但我的观点1可以适用于这里,如果该模块还具有辅助函数和/或其他类,则最好导入模块然后执行module.Class()
。