2011-07-06 24 views
3

快速背景:写一个模块。我的一个对象的方法可能会也可能不会被成功完成 - 这取决于我的模块下面使用的框架。因此,一些方法首先需要检查他们实际上在他们脚下的框架。解决这一当前的方法是:导入功能而不是开始或脚本?

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

此版本可能会更快,因为没有给函数每次调用需要尝试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

类似到larsmans建议,但有轻微的变化

def NotImplemented(): 
    raise NotImplementedError 

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

def framework_dependent_function(): 
    #whatever 
    return 

我不喜欢的try: except:的函数定义的想法导入

+1

这影响了'framework_dependent_function'的第一个定义。 –

+0

@Jakob:你必须在'try'之前放* * def'块,否则你的'NotImplemented'版本总是会被反弹回到下面的'def'。 –

+0

好点D:。 –

1

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