处理仅由某些 Python 类使用的导入的最佳方法

如何解决处理仅由某些 Python 类使用的导入的最佳方法

我正在制作一个 Python 包,在一个模块中,我有几个 Python 类,但其中只有一个使用特定的包(tensorflow),该包是使用 {{1} 中的 extras_require 选项安装的} 文件,因为它是一个严重的依赖项,并且在项目的很小一部分中使用。

假设我在同一个模块中有 MyClassRegularMyClasstF 类,只有第二个需要 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

https://github.com/seatgeek/fuzzywuzzy/blob/9e3d2fe0d8c1b195696d5fbcda78c371dd4a6b8f/fuzzywuzzy/fuzz.py#L7

,

为了防止每次实例化 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?