2011-07-06 5 views
3

クイックバックグラウンド:モジュールを作成します。私のオブジェクトの1つに、自分のモジュールの下で使用されるフレームワークに応じて、正常に完了するかどうかを判断する方法があります。だから、いくつかの方法はまず彼らが実際にどのような枠組みを持っているかを確認する必要があります。これを取り組むの現在の方法がある:私の心の中で冒頭またはスクリプトの代わりに関数でインポートしますか?

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__のどこかで、モジュールがどのような環境で動作しているかを調べる他の方法はありますか?すべて定義し、その後、

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にモジュールを単一の試行を行うことができます:関数のないすべての呼び出しがimportに必要な機能を試してみる必要があるため

答えて

3

このバージョンでは、速いかもしれおそらく

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

として、単一のブロックでは使用できない場合があります機能の(私の現在のプロジェクトは、1が01と呼ばれた他の輸入品に近い、あるいは別のモジュールでは、ファイルの先頭にこれを入れて)。

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

同様:あなたはtry/exceptブロックにおける関数定義が気に入らない場合は、これらの機能は、メソッドをする必要がある場合は、その後、あなたのclass後でにそれらを追加することができ、

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

を行います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:* 'def'ブロックを' try'の前に置く必要があります。そうしないと、 'NotImplemented'バージョンは常に以下の' def'にリバウンドします。 –

+0

良い点D:。 –

1

imp.find_modulehere参照)を使用して、特定のモジュールが存在するかどうかを確認することもできます。

関連する問題