Python でオブジェクトが関数型かどうかを確認する一般的な方法はありますか?

StackOverflow https://stackoverflow.com/questions/74092

  •  09-06-2019
  •  | 
  •  

質問

dir(obj) から返された属性を反復処理する Python の関数があり、その中に含まれるオブジェクトが関数、メソッド、組み込み関数などであるかどうかを確認したいと考えています。通常、これには callable() を使用できますが、クラスは含めたくありません。私がこれまでに思いついた最高のものは次のとおりです。

isinstance(obj, (types.BuiltinFunctionType, types.FunctionType, types.MethodType))

このチェックを行うための、より将来性のある方法はありますか?

編集: 以前言い間違えてこう言いました。「通常、Callable()を使用できますが、クラスを失格にしたくありません。」私は実際に する 授業を失格にしたい。合わせたい のみ クラスではなく関数です。

役に立ちましたか?

解決

検査モジュールには、まさに必要なものが含まれています。

inspect.isroutine( obj )

参考までに、コードは次のとおりです。

def isroutine(object):
    """Return true if the object is any kind of function or method."""
    return (isbuiltin(object)
            or isfunction(object)
            or ismethod(object)
            or ismethoddescriptor(object))

他のヒント

クラスやその他のランダムなオブジェクトを除外したい場合は、 __call__ メソッドをチェックし、関数とメソッドのみをチェックします。これらの 3 つの関数は、 inspect モジュール

inspect.isfunction(obj)
inspect.isbuiltin(obj)
inspect.ismethod(obj)

将来性のある方法でやりたいことをやるべきです。

if hasattr(obj, '__call__'): pass

これは、Python の「ダック タイピング」哲学にもよく適合します。なぜなら、実際には気にしないからです。 あなたがそれを呼び出すことができる限り、それはそうです。

注目に値するのは、 callable() Python から削除されており、3.0 には存在しません。

「クラス」が何を意味するかに応じて、次のようになります。

callable( obj ) and not inspect.isclass( obj )

または:

callable( obj ) and not isinstance( obj, types.ClassType )

たとえば、「dict」の場合は結果が異なります。

>>> callable( dict ) and not inspect.isclass( dict )
False
>>> callable( dict ) and not isinstance( dict, types.ClassType )
True
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top