没有,设计。如果您想在导入子模块时避免太多开销,您只需使用空的__init__.pys 来定义包。这样,导入包的开销几乎为零。
如果pandas 没有不 这样做,那么您有没有 方法来导入pandas.io.clipboard 而无需先导入pandas 和io。您可以做的,但是它是一个巨大的hack并且它是不等效的,是将clipboard模块作为普通模块导入作为一个子模块。您只需找到安装pandas 的位置(例如/usr/lib/pythonX.Y/dist-packages/)并将父包的路径插入sys.path(在您的情况下为/usr/lib/pythonX.Y/dist-packages/pandas/io)。然后您可以通过以下方式导入clipboard 包:
import clipboard
但请注意:
import clipboard
from pandas.io import clipboard as clipboard2
print(clipboard == clipboard2)
将打印False。事实上,这样做会破坏很多代码,因为您从根本上破坏了import 机制假设的一些不变量。
特别是如果子模块确实使用相对导入引用了其他子模块,则导入将失败,并且在其他情况下它不会正确运行。另一个失败的例子是你必须处理腌制的物体。如果您使用导入为 pandas.io.clipboard 的模块腌制了一些对象,您将不能够使用如上所述导入的模块 clipboard 取消腌制它们。
总之,不要!我建议:
- 如果导入包所花费的时间不是一个真正的问题,请接受它。
- 或者:尝试寻找替代品。如果您只需要
pandas.io.clipboard 而不需要pandas 的其余部分,那么您首先不应该使用pandas,而应该使用仅实现clipboard 功能的较小包。
如果您查看pandas.util.clipboard source code,您会发现它实际上只是pyperclip 模块版本1.7。您可以在site-packages 中添加此模块并使用它来代替pandas 提供的模块。事实上pandas 团队只是在源代码末尾添加了以下部分:
## pandas aliases
clipboard_get = paste
clipboard_set = copy
扩展一下为什么 python 导入是这样工作的。
正如你在 python 中所知道的那样,模块就是对象。 包也是模块,虽然不是每个模块都是包。当你导入一个包时:
import pandas.io.clipboard
Python 必须:
- 创建
module 实例pandas
- 创建
module 实例io 并将其作为属性添加到pandas
- 创建
module 实例clipboard 并将其作为属性添加到io。
为了创建module实例python必须执行模块中的代码。
表单的导入:
from pandas.io import clipboard
只是语法糖:
import pandas.io.clipboard
clipboard = pandas.io.clipboard
del pandas.io
请注意,在from 的情况下,clipboard 可以是module/包,也可以只是在io 中定义的东西。为了检查这一点,解释器必须还导入io,为此它必须还导入pandas。