首页 > 解决方案 > 导入库不同的方法

问题描述

import library as lib和有什么区别from library import (....)?我看到人们使用from library import (....)and import library as lib。并想知道哪一个是最佳实践。

你能帮助我吗?谢谢你。

标签: python

解决方案


两者在功能上没有区别,但出于美学、可读性和可维护性的原因,两者都有微妙的优缺点。

一些常见的考虑:

  • 如果导入模块中的名称被大量引用,每次使用时在名称前面加上其模块名称可能会显得冗长,例如必须重复写入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.

推荐阅读