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

hat*_*rix 6 python import

例如,我想使用numpyisnan功能.我已经加载了pandas库:

import pandas as pd

pd.np.isnan(1) #=> False
Run Code Online (Sandbox Code Playgroud)

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

import pandas as pd
import numpy as np

np.isnan(1) #=> False
Run Code Online (Sandbox Code Playgroud)

什么是好习惯?

iCo*_*dez 10

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

  1. 正如@abarnert在评论中所说,它遵循PEP 0008中公共和内部接口下的Python代码的官方指南.具体来说,PEP说:

    应假定所有未记录的接口都是内部接口.

    和:

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

    因为NumPy是Pandas图书馆的无证方面(help(pd)官方网站上也没有提及 ),因此不应将其视为熊猫的官方部分.

  2. "显式优于隐式",第二种方法明确表示我们在代码中直接使用NumPy库.然而,第一种方法通过熊猫图书馆"滑入".

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

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