1. ホーム
  2. python

[解決済み] Pythonの変数が関数であるかどうかを検出するにはどうすればよいですか?

2022-03-23 13:58:37

質問

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

というようなことができればと思っていました。

>>> isinstance(x, function)

でも、そのおかげで

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

これを選んだ理由は

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

解決方法は?

Python 2.xまたはPython 3.2+の場合は、以下のようにします。 callable() . 以前は非推奨でしたが、現在は非推奨になりましたので、再び使用することができます。議論はこちらで読むことができます。 http://bugs.python.org/issue10518 . でできます。

callable(obj)

Python 3.x 用で 3.2 より前の場合は、オブジェクトに __call__ 属性があります。で行うことができます。

hasattr(obj, '__call__')

よく言われる types.FunctionTypes または inspect.isfunction のアプローチ(どちらも 全く同じこと には、いくつかの注意点があります。それは False は、Python以外の関数の場合です。ほとんどの場合 組み込み関数 例えば、PythonではなくCで実装されているため、Pythonで実装した場合、Pythonで実装した場合は False :

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

だから types.FunctionType は、意外な結果をもたらすかもしれません。アヒル型のオブジェクトのプロパティを確認する正しい方法は、アヒルサイズの容器に収まるかどうかではなく、アヒルが鳴くかどうかを尋ねることです。