在函数中导入而不是在开头或脚本中导入?

时间:2011-07-06 12:22:30

标签: python

快速背景:编写模块。我的一个对象有可能成功完成或未成功完成的方法 - 取决于我模块下面使用的框架。因此,一些方法首先需要检查他们实际拥有的框架。解决这个问题的当前方法是:

def framework_dependent_function():
    try:
        import module.that.may.not.be.available
    except ImportError:
        # the required functionality is not available
        # this function can not be run
        raise WrongFramework 
        # or should I just leave the previous exception reach higher levels?

[ ... and so on ... ]

然而我心中的一些东西一直告诉我,在文件中间进行导入是一件坏事。不记得为什么,甚至不能想出一个理由 - 除了稍微杂乱的代码,我猜。

那么,做我在这里做的事情有什么彻头彻尾的错吗?也许是在__init__附近的某个地方侦察模块运行环境的其他方法吗?

3 个答案:

答案 0 :(得分:3)

此版本可能更快,因为并非每次调用该函数都需要尝试import必要的功能:

try:
    import module.that.may.not.be.available
    def framework_dependent_function():
        # whatever
except ImportError:
    def framework_dependent_function():
        # the required functionality is not available
        # this function can not be run
        raise NotImplementedError

这也允许您单独尝试import模块,然后定义单个块中可能不可用的所有函数,甚至可能

def notimplemented(*args, **kwargs):
    raise NotImplementedError
fn1 = fn2 = fn3 = notimplemented

将它放在文件的顶部,靠近其他导入,或放在一个单独的模块中(我当前的项目有一个名为utils.fixes)。如果您不喜欢try / except块中的函数定义,请执行

try:
    from module.that.may.not.be.available import what_we_need
except ImportError:
    what_we_need = notimplemented

如果这些功能需要是方法,那么您可以稍后将它们添加到class

class Foo(object):
    # assuming you've added a self argument to the previous function
    framework_dependent_method = framework_dependent_function

答案 1 :(得分:1)

与larsmans建议类似,但略有改变

def NotImplemented():
    raise NotImplementedError

try:
    import something.external
except ImportError:
    framework_dependent_function = NotImplemented

def framework_dependent_function():
    #whatever
    return 

我不喜欢导入的try: except:中的函数定义的概念

答案 2 :(得分:1)

您还可以使用imp.find_module(请参阅here)以检查是否存在特定模块。