python - 导入库不同的方法
问题描述
import library as lib
和有什么区别from library import (....)
?我看到人们使用from library import (....)
and import library as lib
。并想知道哪一个是最佳实践。
你能帮助我吗?谢谢你。
解决方案
两者在功能上没有区别,但出于美学、可读性和可维护性的原因,两者都有微妙的优缺点。
一些常见的考虑:
- 如果导入模块中的名称被大量引用,每次使用时在名称前面加上其模块名称可能会显得冗长,例如必须重复写入
lib.func
而不是仅func
. 在这种情况下,从模块中导入名称会使代码看起来更简洁,这样名称就可以在没有模块名称的情况下使用。例如,如果您有一个复杂的公式,例如y = sqrt(cos(x)) - sqrt(sin(x))
,您不想让代码看起来比使用y = math.sqrt(math.cos(x)) - math.sqrt(math.sin(x))
. - 如果希望从导入的模块中使用大量名称,那么用
from lib import a, b, c, d...
语句详尽地列出所有这些名称会显得过于冗长。例如,通常仅import ast
用于语法树遍历,因为许多情况ast
涉及对超过 10 种节点类型的引用,因此import ast
通常首选简单的语句而不是过长的语句from ast import Module, Expression, FunctionDef, Call, Assign, Subscript, ...
。 - 上面的长语句也展示了它的可维护性问题。如果随着时间的推移,代码的逻辑涉及更多节点类型,则必须将新引用的节点类型添加到从模块导入的一长串名称中。相反,如果从模块中导入的名称之一随着时间的推移变得未使用,则应将其从该长列表中删除。当您使用
import ast
. - 从模块导入名称会污染当前模块的命名空间,增加与本地名称或从其他模块导入的名称冲突的可能性。当导入名称的语言是通用语言时,这种情况尤其可能发生。例如,不鼓励这样做,
from re import search
因为它search
是一个常用的名称,并且很可能存在从另一个模块导入的局部变量命名search
或命名函数导致名称冲突。search
- 上面示例的另一点是,编写
search(...)
代码会使您的代码比编写代码更易读,re.search(...)
因为search
这个术语太笼统了。调用re.search
清楚表明您正在执行正则表达式搜索,而调用search
看起来模棱两可。因此,from lib import a
仅在a
其本身是特定术语时使用,例如from math import sqrt
.
推荐阅读
- excel - .Hidden 属性的意外行为
- python - 如何修改特定 dask 数据框分区的值?
- python - Extracting statistics/information from images
- c# - C# MVC:操作可能会破坏运行时的稳定性
- python - 计划任务执行中的芹菜错误
- sockets - ICMP RAW Socket 接收不完整
- automation - 编码的 ui 对象存储库
- mysql - 表被锁定在 MySQL 数据库中
- mongodb - Mongodb 3.4.7 分组后一个字段的聚合不同计数
- c# - C# 检查 PropertyInfo 的类型是否是原始的