【问题标题】:Pythonic way to handle import errorsPythonic 处理导入错误的方法
【发布时间】:2015-02-25 01:24:41
【问题描述】:

我在我的项目中使用自定义日志记录模块。如果它不可用,我想用一个假人代替它,而不是提出一个ImportError

这是当前执行此操作的代码:

try:
    import logger
except ImportError:
    print 'Couldn\'t load logger'

    class DummyLogger(object):
        def __init__(self):
            pass
        def log(self, image):
            pass

    logger = DummyLogger()

我认为这不是一个优雅的解决方案。它确实有效,但它并不好。有没有更好的办法?

【问题讨论】:

  • 为什么不可用?
  • @ArashSaidi,我的程序是一个图像处理管道。它需要一张图像,对其进行处理,然后保存结果。另外,我有一个用于训练我在内部使用的分类器的脚本。该脚本需要对原始数据进行一些预处理,然后再将其输入分类器。预处理例程在我正在谈论的模块中。该模块位于主项目的子目录中,因此当我运行主程序时,一切正常。当我运行训练时,模块看不到文件系统中上一级的记录器。

标签: python import python-import


【解决方案1】:

我会将虚拟实现放入一个单独的模块中,称为dummy_loggger,然后写:

try:
    import logger
except ImportError:
    import dummy_logger as logger

我过去曾使用 JSON 解析器完成此操作:

try:
    import ujson as json  # very fast but might not be available in some cases
except ImportError:
    import json

【讨论】:

  • 在比我更有条理的环境中,这将是一个完美的解决方案。不幸的是,这仍然需要外部依赖,所以这不是 100% 防弹的。我赞成您的回答,但接受@AlexMartelli 的回答。
【解决方案2】:

你可以很容易地使它更简洁:

try:
    import logger
except ImportError:
    print 'Couldn\'t load logger'

    class logger(object):
        @classmethod
        def log(cls, image):
            pass

请注意,即使在您当前的版本中,空的__init__ 也应该被删除——它不会增加任何价值。

【讨论】:

  • 谢谢,这正是我一直在寻找的。您还可以将 @classmethod 替换为 @staticmethod 以摆脱 cls 参数。
猜你喜欢
  • 2018-11-28
  • 2013-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 2011-03-09
  • 2013-04-25
相关资源
最近更新 更多