我想要一个函数在运行函数中的其他行之前快速检查模块是否存在。它可以在大型代码库中的其他几个程序中执行,并且我不想在运行它的任何地方导入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)
。但是如果函数是在某个地方导入并在没有大熊猫的地方运行怎么办?我只是意识到这一点,而不是不必要地破坏了整个程序或导入的大熊猫。
答案 0 :(得分:2)
您似乎在已安装的库与已导入的库之间感到困惑。
您的用例似乎与Pandas未安装有关。您无法使用sys.modules
测试此可能性。只需让您的代码导入Pandas,并处理ImportError
如果它不可用则抛出:
try:
import pandas as pd
def is_dataframe(obj):
return isinstance(obj, pd.DataFrame)
except ImportError:
def is_dataframe(obj):
return False
上面的代码编写了数据帧类型的测试,如果没有安装Pandas,它将继续工作。
如果您的代码需要考虑某些第三方库返回数据帧的可能性,只需使用上面的代码来测试该意外情况(但前提是您不能让代码在其他方面工作)如果某些东西不是你期望处理的类型,就像捕获异常一样。不要试图猜测Pandas是否真的被某个地方使用过。要么你处理数据帧,要么你不处理数据帧,没有必要使这个动态。如果isinstance(obj, pd.DataFrame)
不是数据框,那么obj
测试就不会抛出异常,这里没有风险。
请注意,如果您尝试测试正在导入的模块,检测到它不是,并且只有另一个模块导入Pandas ,则您拨打了错误的电话并且您的代码中断了。 Python是一种动态语言,可以在程序运行期间随时进行导入。
否则,如果安装了Pandas ,并且某些第三方模块导入Pandas来完成他们的工作并且您担心他们可能会这样做,您的代码无需担心此。您无需查看第三方模块是否正在使用Pandas,它不会对您的代码产生影响。然后,熊猫只是另一个模块的实现细节。
最后,如果第三方模块导入Pandas,您自己的模块也不会看到它。您需要对该模块的所有依赖项使用import
语句,此处导入的另一个模块并不重要,因为每个模块都是一个单独的命名空间。您不能在没有pd.DataFrame
语句(或将名称import
绑定到模块对象的其他方法)的情况下使用pd
,无论其他模块是否已导入它。