是否使用由另一个包导入的包是unpythonic,还是应该直接导入它?

时间:2014-12-13 03:30:07

标签: python import

例如,我想使用numpy的{​​{1}}函数。我已经加载了pandas库:

isnan

这有效,但有什么不利之处吗?或者我应该写

import pandas as pd

pd.np.isnan(1) #=> False

什么是好习惯?

1 个答案:

答案 0 :(得分:10)

你应该使用第二种方法至少有四个原因:

  1. 正如@abarnert在评论中所说,它遵循PEP 0008中Public and internal interfaces下所述的Python代码的官方指南。具体来说,PEP说:

      

    应假设所有未记录的接口都是内部接口。

      

    导入的名称应始终被视为实施细节。   其他模块不得依赖于对这些导入名称的间接访问   除非它们是明确记录的部分内容   模块的API,例如os.path或包的__init__模块   公开子模块的功能。

    因为NumPy是Pandas库的一个未记录的方面(在help(pd)或官方网站上都没有提及),所以它不应被视为Pandas的官方部分。

  2. "Explicit is better than implicit",第二种方法明确表示我们在代码中直接使用NumPy库。然而,第一种方法通过熊猫图书馆“滑入”。

  3. 代码分析工具将无法看到您的代码直接使用NumPy。这可能会生成有关您的代码的错误数据(例如它具有哪些依赖关系)。

  4. Pandas包含NumPy的事实只不过是一个实现细节。意思是,如果Pandas的制造商改变他们的内部代码以任何方式改变这个细节,那么你的所有Numpy代码都可能在它真的不应该突然中断。 Numpy和Pandas是两个不同的东西,应该这样对待。