【问题标题】:How to exit a module before it has finished parsing?如何在完成解析之前退出模块?
【发布时间】:2010-10-09 07:01:55
【问题描述】:

我有一个导入模块的模块,但在某些情况下,导入的模块可能不存在。导入模块后,有一个类继承自导入模块的类。如果我要在模块不存在的情况下捕获ImportError 异常,我该如何阻止 Python 解析模块的其余部分?如果不可能,我愿意接受其他解决方案。

这是一个基本示例(selfaware.py):

try:
    from skynet import SkyNet
except ImportError:
    class SelfAwareSkyNet():
        pass
    exit_module_parsing_here()

class SelfAwareSkyNet(SkyNet):
    pass

我能想到的唯一方法是:

  • 在导入selfaware.py 模块之前,检查skynet 模块是否可用,并简单地传递或创建一个存根类。如果多次导入selfaware.py,这将导致 DRY。
  • selfaware.py 中,使用try 块定义类。例如:

    try:
        from skynet import SkyNet
        class SelfAwareSkyNet(SkyNet):
            pass
    except ImportError:
        class SelfAwareSkyNet():
            pass
    

【问题讨论】:

  • 您的解决方案有什么问题?它不工作吗?会出错吗?
  • 这里有回声吗??所有完全相同的重复答案是怎么回事?为什么两个新副本的分数都比旧副本高?
  • @MuMind 我想我没有注意到 hyperboreean 的答案在最初不正确后被编辑。我已经重新接受了答案。

标签: python import module


【解决方案1】:

try: 支持 else: 子句

try:
    from skynet import SkyNet

except ImportError:
    class SelfAwareSkyNet():
        pass

else:
    class SelfAwareSkyNet(SkyNet):
        pass

【讨论】:

    【解决方案2】:

    你可以使用:

    try:
       from skynet import SkyNet
       inherit_from = SkyNet
    except ImportError:
       inherit_from = object
    
    class SelfAwareSkyeNet(inherit_from):
        pass
    

    这只有在实现没有区别时才有效。

    编辑:评论后的新解决方案。

    【讨论】:

      猜你喜欢
      • 2019-06-13
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      • 2019-07-22
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多