您如何选择在已发布的包中导入模块?
How do you optionally import a module in a published package?
我想在已发布的包中导入一个模块,只有在已安装的情况下,我正在寻找正确的方法。
关于可选模块的几个现有问题被欺骗并指向此处。
What's Python good practice for importing and offering optional features?
但他们都依赖 try except ImportError:
块来工作。
最近关于检查模块存在的更好方法(python 版本特定)的讨论在这里:How to check if a python module exists without importing it 它提供了很好的检查方法,但它们涉及 ImportError 屏蔽模块的危险问题,而不是实际不存在。一般讨论似乎集中在一个版本或另一个版本的独立代码上,而不是用于任何版本和分发的包。
所以,如果我将这两个讨论结合起来,我会得到:
def module_exists(module_name):
import sys
import pkgutil
import importlib
if sys.version_info < (3,0):
return pkgutil.find_loader(module_name) is not None
elif sys.version_info >= (3,0) and sys.version_info <= (3,3):
return importlib.find_loader(module_name) is not None
elif sys.version_info > (3,3):
return importlib.util.find_spec(module_name) is not None
return False
我担心这看起来很脆弱。或者至少就像我在重新发明一个轮子。
我应该继续使用 try except ImportError
的旧答案吗?因为,与第二个引用的 ImportError 问题不同,如果导入时出错,我仍然无法实际使用当前模块。或者礼貌的做法是尝试使用它并因为当前模块的问题而崩溃,而不是假装它不存在 (ImportError
) 而不是当它存在时?
我的用例只是为了提供增强的功能,如果某个模块存在于广泛分布的包的一个本地化配置文件下。我不想让其他本地化的任何用户负担一个根本无法帮助他们的模块。即使没有第三方模块,正常功能也会继续。
使用
try:
import somemodule
except ImportError:
# handle module not being available
ImportError
是否掩盖了模块的问题并不重要 - 你只关心它是否可导入,所以导入它是最好的测试。
我想在已发布的包中导入一个模块,只有在已安装的情况下,我正在寻找正确的方法。
关于可选模块的几个现有问题被欺骗并指向此处。
What's Python good practice for importing and offering optional features?
但他们都依赖 try except ImportError:
块来工作。
最近关于检查模块存在的更好方法(python 版本特定)的讨论在这里:How to check if a python module exists without importing it 它提供了很好的检查方法,但它们涉及 ImportError 屏蔽模块的危险问题,而不是实际不存在。一般讨论似乎集中在一个版本或另一个版本的独立代码上,而不是用于任何版本和分发的包。
所以,如果我将这两个讨论结合起来,我会得到:
def module_exists(module_name):
import sys
import pkgutil
import importlib
if sys.version_info < (3,0):
return pkgutil.find_loader(module_name) is not None
elif sys.version_info >= (3,0) and sys.version_info <= (3,3):
return importlib.find_loader(module_name) is not None
elif sys.version_info > (3,3):
return importlib.util.find_spec(module_name) is not None
return False
我担心这看起来很脆弱。或者至少就像我在重新发明一个轮子。
我应该继续使用 try except ImportError
的旧答案吗?因为,与第二个引用的 ImportError 问题不同,如果导入时出错,我仍然无法实际使用当前模块。或者礼貌的做法是尝试使用它并因为当前模块的问题而崩溃,而不是假装它不存在 (ImportError
) 而不是当它存在时?
我的用例只是为了提供增强的功能,如果某个模块存在于广泛分布的包的一个本地化配置文件下。我不想让其他本地化的任何用户负担一个根本无法帮助他们的模块。即使没有第三方模块,正常功能也会继续。
使用
try:
import somemodule
except ImportError:
# handle module not being available
ImportError
是否掩盖了模块的问题并不重要 - 你只关心它是否可导入,所以导入它是最好的测试。