To zależy co masz na myśli przez „Built-In”.
Korzystanie __builtins__
Jeśli chcesz sprawdzić, czy funkcja ta jest jedną z funkcji wbudowanych w interpretera Pythona można użyć
>>> pow in __builtins__.__dict__.values()
True
>>> __builtins__.__dict__['pow']
<built-in function pow>
Interpreter Pythona posiada szereg wbudowanych -w stałych, funkcjach, typach i wyjątkach, które są zawarte w słowniku __builtins__.__dict__
.
Korzystanie BuiltinFunctionType
Jeśli natomiast chcesz, aby sprawdzić, czy funkcja jest typu BuiltinFunctionType
można użyć modułu
>>> import types
>>> isinstance(pow, types.BuiltinFunctionType)
True
Korzystanie inspect
Or types
inspect.isbuiltin
(tylko opakowanie około isinstance(object, types.BuiltinFunctionType)
)
>>> import inspect
>>> inspect.isbuiltin(pow)
True
Należy zauważyć, że termin „wbudowany” w BuiltinFunctionType
oznacza „napisany w języku C”.
Rozważmy następujący przykład:
>>> from math import factorial
>>> isinstance(factorial, types.BuiltinFunctionType)
True
Funkcja factorial
jest typu BuiltinFunctionType
ale to nie jest wbudowana funkcja w tłumacza
>>> factorial in __builtins__.__dict__.values()
False
To dlatego, że moduł w Pythonie math
składa wrappery wokół funkcji bibliotecznych C matematyki.
Możliwość wykrywania BuiltinFunctionType
jest przydatna, ponieważ w przypadku funkcji napisanych w Pythonie można sprawdzać kod źródłowy bez konieczności otwierania plików źródłowych.
>>> 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()
Jako @ iMom0 powiedział w swojej odpowiedzi - można użyć 'isinstance (X, Y)' 'zamiast przy użyciu typu (x) == type (z)', myślę, że to bardziej pythonic :) – slallum
cię "w porządku, co myślałem. –
To nie mówi, czy wbudowana jest funkcja, lecz informuje, czy jest to natywnie skompilowana funkcja C. Moduły firm trzecich z rozszerzeniami C również będą zgłaszać swoje funkcje jako tego typu. –