如何解决处理仅由某些 Python 类使用的导入的最佳方法
我正在制作一个 Python 包,在一个模块中,我有几个 Python 类,但其中只有一个使用特定的包(tensorflow),该包是使用 {{1} 中的 extras_require
选项安装的} 文件,因为它是一个严重的依赖项,并且在项目的很小一部分中使用。
假设我在同一个模块中有 MyClassRegular 和 MyClasstF 类,只有第二个需要 tensorflow,我在顶层导入包文件使用:
setup.py
所以这有两个问题:
- 如果作为用户,我正在导入 MyClassRegular,它会针对我什至不需要或不关心的包发出警告,因为我使用的是与 tensorflow 无关的功能
- 如果出于某种原因,我安装了 tensorflow,它可能会开始发出警告消息,例如 cuda 版本不正确,或未找到 GPU 等,这同样与 MyClassRegular 无关。
所以我想到的是在 MyClasstF 中导入包,我知道这可能会以某种方式违反 PEP 8,但我没有看到更好的方法来处理它。因此,尝试使用此选项,我遇到的问题是,如果我在 init 上导入模块,则类方法无法识别它:
try:
import tensorflow as tf
except ModuleNotFoundError:
logging.error("Tensorflow not found,pip install tensorflow to use MyClasstF")
我可以将 tensorflow 分配给这样的变量,但感觉不对:
class MyClasstF:
def __init__(self):
try:
import tensorflow as tf
except ModuleNotFoundError:
logging.error("Tensorflow not found,pip install tensorflow to use MyClasstF")
def train(self):
print(tf.__version__) # <--- tensorflow it's not recognized here
def predict(self):
print(tf.__version__) # <--- Again,not recognized
那么,处理这个问题的最佳 Pythonic 方法是什么?
编辑: MyClassRegular 和 MyClasstF 都使用
导入到顶部class MyClasstF:
def __init__(self):
try:
import tensorflow as tf
self.tf = tf
except ModuleNotFoundError:
logging.error("Tensorflow not found,pip install tensorflow")
文件中
__init__.py
解决方法
另一种方式,如果您想延迟发出警告,直到实际使用该类(我认为这就是您想要达到的目的)是什么
try:
import tensorflow as tf
except ImportError:
# Allow the ImportError to pass silently and just assign tf to None
tf = None
class MyTF:
def __init__(self):
if tf is None:
warnings.warn('pip install tensorflow to use this class')
或类似的东西。无需在方法体本身中进行导入,或将 tensorflow 模块分配给实例属性,这是可行的,但非常不寻常。上面的模式比较常见。
,Huumm 不是最简单的事情,您的解决方案看起来不错。但是,我会尝试将该类放在一个单独的文件中,该文件不会在您的包中的其他地方导入。在模块级别使用相同的 try 代码,那么用户只有在尝试导入该包时才会看到该错误。也像这样,我想你的 python linters 应该很高兴。
一些软件包使用它来控制行为,例如 fuzzywuzzy
try:
from .StringMatcher import StringMatcher as SequenceMatcher
except ImportError:
if platform.python_implementation() != "PyPy":
warnings.warn('Using slow pure-python SequenceMatcher. Install python-Levenshtein to remove this warning')
from difflib import SequenceMatcher
,
为了防止每次实例化 tf
时测试 MyTF
的开销,我会这样进行:
try:
import tensorflow as tf
class MyTF(object):
...
except ImportError:
class MyTF(object):
def __init__(self,*args,**kwargs):
raise RuntimeError("tensorflow library not available,"
"please install it to enable MyTF functionalities")
或者如果 MyTF
是一个长代码,为了提高可读性,将所有依赖于 tensorflow
的东西放在一个 _internal_tf.py
模块中,然后:
try:
from ._internal_tf import MyTF
except ImportError:
class MyTF(object):
def __init__(self,"
"please install it to enable MyTF functionalities")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。