11

オブジェクト o が Python の組み込み関数かどうかを確認する良い方法はありますか?

たとえば、使用できることを知っています

type(o) == type(pow)

type(pow) は「builtin_function_or_method」であるためです。

しかし、もっと良い方法はありますか?

4

6 に答える 6

16

タイプ モジュール:

>>> import types
>>> types.BuiltinFunctionType
<type 'builtin_function_or_method'>

とはいえ、ボンネットの下を見ると、現在行っていることとそれほど変わらないことがわかります。

したがって、あなたの場合、使用します

isinstance(o, types.BuiltinFunctionType)
于 2012-09-10T08:15:13.187 に答える
5

それは、「組み込み」の意味によって異なります。

使用する__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

「組み込み」という用語は、「BuiltinFunctionTypeC で記述された」という意味であることに注意してください。

次の例を検討してください。

>>> from math import factorial
>>> isinstance(factorial, types.BuiltinFunctionType)
True

factorial関数はタイプですBuiltinFunctionTypeが、インタープリターの組み込み関数ではありません

>>> factorial in __builtins__.__dict__.values()
False

これはmath、Python のモジュールが C 数学ライブラリ関数のラッパーで構成されているためです。

BuiltinFunctionTypePython で記述された関数の場合、ソース ファイルを開かなくてもソース コードを調べることができるため、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()
于 2016-08-07T10:55:20.297 に答える
3

これを試して:

>>> import types
>>> isinstance(pow, types.BuiltinFunctionType)
True
>>> def a():
    pass
>>> isinstance(a, types.BuiltinFunctionType)
False
于 2012-09-10T08:17:56.570 に答える
2

あなたもできる

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
>>>
于 2012-09-10T08:19:21.577 に答える