オブジェクト o が Python の組み込み関数かどうかを確認する良い方法はありますか?
たとえば、使用できることを知っています
type(o) == type(pow)
type(pow) は「builtin_function_or_method」であるためです。
しかし、もっと良い方法はありますか?
オブジェクト o が Python の組み込み関数かどうかを確認する良い方法はありますか?
たとえば、使用できることを知っています
type(o) == type(pow)
type(pow) は「builtin_function_or_method」であるためです。
しかし、もっと良い方法はありますか?
タイプ モジュール:
>>> import types
>>> types.BuiltinFunctionType
<type 'builtin_function_or_method'>
とはいえ、ボンネットの下を見ると、現在行っていることとそれほど変わらないことがわかります。
したがって、あなたの場合、使用します
isinstance(o, types.BuiltinFunctionType)
それは、「組み込み」の意味によって異なります。
使用する__builtins__
関数がPythonインタープリターの組み込み関数の1つであることを確認したい場合は、使用できます
>>> pow in __builtins__.__dict__.values()
True
>>> __builtins__.__dict__['pow']
<built-in function pow>
Python インタープリターには、ディクショナリに含まれる多数の組み込み定数、関数、型、および例外があります__builtins__.__dict__
。
使用するBuiltinFunctionType
一方、関数が型であるかどうかを確認したい場合は、モジュールBuiltinFunctionType
を使用できますtypes
>>> import types
>>> isinstance(pow, types.BuiltinFunctionType)
True
使用するinspect
またはinspect.isbuiltin
(ただのラッパーisinstance(object, types.BuiltinFunctionType)
)
>>> import inspect
>>> inspect.isbuiltin(pow)
True
「組み込み」という用語は、「BuiltinFunctionType
C で記述された」という意味であることに注意してください。
次の例を検討してください。
>>> from math import factorial
>>> isinstance(factorial, types.BuiltinFunctionType)
True
factorial
関数はタイプですBuiltinFunctionType
が、インタープリターの組み込み関数ではありません
>>> factorial in __builtins__.__dict__.values()
False
これはmath
、Python のモジュールが C 数学ライブラリ関数のラッパーで構成されているためです。
BuiltinFunctionType
Python で記述された関数の場合、ソース ファイルを開かなくてもソース コードを調べることができるため、a を検出できると便利です。
>>> import random
>>> isinstance(random.random, types.BuiltinFunctionType)
True
>>> inspect.getsource(random.random)
# returns TypeError
>>> isinstance(random.uniform, types.BuiltinFunctionType)
False
>>> from __future__ import print_function # if using Python 2.*
>>> print(inspect.getsource(random.uniform))
def uniform(self, a, b):
"Get a random number in the range [a, b) or [a, b] depending on rounding."
return a + (b-a) * self.random()
これを試して:
>>> import types
>>> isinstance(pow, types.BuiltinFunctionType)
True
>>> def a():
pass
>>> isinstance(a, types.BuiltinFunctionType)
False
あなたもできる
import __builtin__
o in __builtin__.__dict__.values()
または、CPython では:
o in __builtins__.__dict__.values()
ただし、ここでは実装の詳細に依存していることに注意してください。
>>> pow in __builtins__.__dict__.values()
True
>>> def a():
... pass
...
>>> a in __builtins__.__dict__.values()
False
>>>