是否可以在函数中导入sys以检查模块是否已导入?

时间:2018-01-23 13:51:27

标签: python python-3.x

我想要一个函数在运行函数中的其他行之前快速检查模块是否存在。它可以在大型代码库中的其他几个程序中执行,并且我不想在运行它的任何地方导入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)。但是如果函数是在某个地方导入并在没有大熊猫的地方运行怎么办?我只是意识到这一点,而不是不必要地破坏了整个程序或导入的大熊猫。

1 个答案:

答案 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,无论其他模块是否已导入它。