2017-01-17 5 views
-2

クラスMyClassが定義されていることがあります。私は関数foo(a=None)を引数aNone、文字列、またはMyClassのオブジェクトにすることができます。定義されていないクラスのisinstanceの使用

私の質問は:MyClassは私のPythonセッションで定義されていない場合、どのように私はNameErrorを得ることなくisinstanceと同様の方法で引数aの種類を確認することができますか?

ダックタイピングについての注意:私は故意に機能を制限しています。

私はPython 2.6.xを使用しています。アップデートはオプションではありません。順方向互換のソリューション(特に2.7.x用)は高く評価されています。

+2

シンプルで、定義されていなければ、 'NameError'を取得します。周囲に道がありません –

+1

あなたのクラスは条件付きで*定義されますか? – deceze

+2

'try-except'を使用してください。あなたのクラスが定義されていない場合は、そのオブジェクトがインスタンスではないということが与えられます。 – DeepSpace

答えて

1

私は別のアプローチを示唆している:ので、それを参照したいすべてのコードは単純にそうすることができるクラスをポリフィル:

try: 
    from foo import Bar # load the native class 
except ImportError: 
    class Bar: 
     pass # implement necessary parts here 

あなたはそれが必要なのはどこでも独自のモジュールにこれを入れた後、from mymodule import Barことができます。これにより、ネイティブに定義されているかどうかに関係なく、すべてのコードでBarを使用することができます。

このクラスを再定義するのが望ましい方法ではない場合でも、importのいずれかの方法でエラーが発生するため、ImportErrorを処理する方法はまだこの状況を処理する方法です。代わりにクラスを定義する代わりに、class_exists = Falseフラグなどを設定することができます。

+0

私はあなたの答えに適応しました。 'class_exists = False'の場合、'(class_existsとisinstance(a、MyClass)) 'は短絡のためにエラーを送出しません。 –

1

MyClassが定義されていない場合は、その型を参照する方法がありません。

したがって、type(a)が正しい値であることを確認する方法がない可能性があります。

関連する問題