【发布时间】:2018-01-23 13:51:27
【问题描述】:
我想要一个函数在运行函数中的其他行之前快速检查模块是否存在。它可能在大型代码库中的其他几个程序中执行,我不想在它运行的任何地方在顶部导入sys。
This answer 解释了检查模块是否存在的过程。
>>> import sys
>>> 'unicodedata' in sys.modules
False
>>> import unicodedata
>>> 'unicodedata' in sys.modules
True
Here 很多人就何时可以在函数中导入发表意见。
以下具体用法可以吗?
def some_function(foo):
import sys
if 'pandas' in sys.modules:
if isinstance(foo, pd.DataFrame):
# function continues
else:
print("pandas has not been imported in the code you are testing")
用例首先检查 pandas 数据框是否满足各种条件,如果满足则执行其他操作。问题是,查看代码库我不能总是确定我正在测试函数的东西是否是一个数据框,所以一直在做if is instance(variable, pd.DataFrame)。但是,如果函数被导入某个地方并在根本没有 pandas 的地方运行呢?我宁愿它刚刚意识到这一点,也不愿让整个程序崩溃或不必要地导入 pandas。
【问题讨论】:
-
如果您需要导入特定模块以运行代码,只需导入模块。为什么需要检查模块?如果您不分享您的用例,我们无法开始告诉您是否可以。
-
否则,
sys是一个内置模块,从 Python 解释器启动的那一刻起就存在(这对于 Python 的运行来说是相当关键的),所以导入sys除了只是设置名称sys以引用模块对象。进口几乎是零成本。 -
@MartijnPieters 添加了一个用例
-
内置异常
ImportError可能对这个检查有用。 docs.python.org/2/library/… -
使用
pd.DataFrame的代码进行导入,没有导入函数的代码。 这不是导入函数的模块需要担心的事情。如果您担心已安装 的依赖项,则无法使用sys.modules测试对其进行测试,因为它仅列出已导入的模块。import pandas as pd语句将抛出ImportError如果未安装模块,只需处理该异常。
标签: python python-3.x