尝试从多个位置导入模块的更简洁方法?

发布于 2024-07-10 21:40:50 字数 339 浏览 10 评论 0原文

有没有办法整理以下代码,而不是一系列嵌套的 try/ except 语句?

try:
    import simplejson as json
except ImportError:
    try:
        import json
    except ImportError:
        try:
            from django.utils import simplejson as json
        except:
            raise "Requires either simplejson, Python 2.6 or django.utils!"

Is there a way to tidy-up the following code, rather than a series of nested try/except statements?

try:
    import simplejson as json
except ImportError:
    try:
        import json
    except ImportError:
        try:
            from django.utils import simplejson as json
        except:
            raise "Requires either simplejson, Python 2.6 or django.utils!"

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

审判长 2024-07-17 21:40:50

我在 http://mail.python.org 找到了以下函数/pipermail/python-list/2007-May/441896.html。 它似乎工作得很好,而且我很确定它的导入方式不会破坏您可能已经拥有的任何现有导入。

def module_exists(module_name):
    try:
        mod = __import__(module_name)
    except ImportError:
        return False
    else:
        return True

if module_exists('simplejson'):
    import simplejson as json
elif module_exists('json'):
    import json
elif module_exists('django.utils'):
    from django.utils import simplejson as json
else:
    raise ImportError('Requires either simplejson, Python 2.6 or django.utils')

我知道这看起来像是更多的代码,但如果您做了很多这样的事情,该函数可以在其他地方重用。

I found the following function at http://mail.python.org/pipermail/python-list/2007-May/441896.html. It seems to work quite well, and I'm pretty sure the way its importing won't stomp on any existing imports you might already have.

def module_exists(module_name):
    try:
        mod = __import__(module_name)
    except ImportError:
        return False
    else:
        return True

if module_exists('simplejson'):
    import simplejson as json
elif module_exists('json'):
    import json
elif module_exists('django.utils'):
    from django.utils import simplejson as json
else:
    raise ImportError('Requires either simplejson, Python 2.6 or django.utils')

I know this seems like more code, but the function is reusable elsewhere if you're doing a lot of this.

假装爱人 2024-07-17 21:40:50
def import_any(*mod_list):
    res = None
    for mod in mod_list:
        try:
            res = __import__(mod)
            return res
        except ImportError:
            pass
    raise ImportError("Requires one of " + ', '.join(mod_list))

json = import_any('simplejson', 'json', 'django.utils.simplejson')
def import_any(*mod_list):
    res = None
    for mod in mod_list:
        try:
            res = __import__(mod)
            return res
        except ImportError:
            pass
    raise ImportError("Requires one of " + ', '.join(mod_list))

json = import_any('simplejson', 'json', 'django.utils.simplejson')
向地狱狂奔 2024-07-17 21:40:50

我很欣赏执行此操作的漂亮函数,但是您在原始问题中说明的模式是满足此要求的最常用模式。 您可以看到它在许多开源项目中使用。

我建议你坚持下去。 请记住,“丑”并不总是“坏”。

I appreciate the pretty functions for doing this, but the pattern you illustrate in the original question is the most commonly used pattern for this requirement. You can see it used in many open source projects.

I suggest you stick with it. Remember "ugly" is not always "bad".

明媚如初 2024-07-17 21:40:50

这避免了嵌套,但我不确定它是否更好:)

json = None

if json is None:
    try:
        import json
    except ImportError:
        pass

if json is None:
    try:
        import simplejson as json
    except ImportError:
        pass

if json is None:
    try:
        from django.utils import simplejson as json
    except ImportError:
        pass    

if json is None:
    raise ImportError('Requires either simplejson, Python 2.6 or django.utils')

This avoids the nesting, but I'm not sure it is any better :)

json = None

if json is None:
    try:
        import json
    except ImportError:
        pass

if json is None:
    try:
        import simplejson as json
    except ImportError:
        pass

if json is None:
    try:
        from django.utils import simplejson as json
    except ImportError:
        pass    

if json is None:
    raise ImportError('Requires either simplejson, Python 2.6 or django.utils')
懒猫 2024-07-17 21:40:50

我提出了一个不依赖于定义函数的简单替代方案:

# Create a dummy enclosing
while True:
    try:
        import simplejson as json
        break
    except:
        pass

    try:
        import json
        break
    except:
        pass

    try:
        from django.utils import simplejson as json
        break
    except:
        pass

    raise ImportError('Requires either simplejson, Python 2.6 or django.utils')

注意,我不完全确定它是否比使用辅助函数的方法更漂亮。

I've come up with a simple alternative that doesn't rely on defining functions:

# Create a dummy enclosing
while True:
    try:
        import simplejson as json
        break
    except:
        pass

    try:
        import json
        break
    except:
        pass

    try:
        from django.utils import simplejson as json
        break
    except:
        pass

    raise ImportError('Requires either simplejson, Python 2.6 or django.utils')

Note, I'm not entirely sure whether it's prettier than the approach using the helper function.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文