変数が関数であるかどうかをどのように検出しますか? 質問する

変数が関数であるかどうかをどのように検出しますか? 質問する

変数 がありx、それが関数を指しているかどうかを知りたいです。

私は次のようなことができると期待していました:

>>> isinstance(x, function)

しかし、それは私に次のことを与えます:

Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: name 'function' is not defined

私がそれを選んだ理由は

>>> type(x)
<type 'function'>

ベストアンサー1

Python 2.xまたはPython 3.2+の場合は、callable()以前は非推奨でしたが、現在は非推奨ではなくなったため、再び使用できます。ここで議論を読むことができます:翻訳: 翻訳者: python. これは次のように実行できます:

callable(obj)

Python 3.x 用だが 3.2 より前の場合は、オブジェクトに__call__属性があるかどうかを確認します。これは次のように実行できます。

hasattr(obj, '__call__')

よく提案されるtypes.FunctionTypesまたはinspect.isfunctionアプローチ(どちらも全く同じもの) にはいくつかの注意点があります。PythonFalse以外の関数に対しては戻り値を返します。組み込み関数たとえば、 は Python ではなく C で実装されているため、 を返しますFalse

>>> isinstance(open, types.FunctionType)
False
>>> callable(open)
True

驚くべき結果が得られるかもしれませんtypes.FunctionType。アヒル型のオブジェクトのプロパティを確認する適切な方法は、アヒルサイズのコンテナに収まるかどうかを確認するのではなく、鳴くかどうかを尋ねることです。

おすすめ記事