2012-09-10 15 views

Odpowiedz

9

Moduł typy:

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

Chociaż, jeśli spojrzeć pod maskę, przekonasz się, że to nie różni się od tego, co robisz teraz.

Tak w przypadku korzystania

isinstance(o, types.BuiltinFunctionType) 
+0

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

+0

cię "w porządku, co myślałem. –

+1

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. –

3

Spróbuj:

>>> import types 
>>> isinstance(pow, types.BuiltinFunctionType) 
True 
>>> def a(): 
    pass 
>>> isinstance(a, types.BuiltinFunctionType) 
False 
2

można też zrobić

import __builtin__ 
o in __builtin__.__dict__.values() 

lub, w CPython:

o in __builtins__.__dict__.values() 

, ale pamiętaj, że polegasz na szczegółach dotyczących implementacji tutaj.


>>> pow in __builtins__.__dict__.values() 
True 
>>> def a(): 
... pass 
... 
>>> a in __builtins__.__dict__.values() 
False 
>>> 
0

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 typesinspect.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() 
Powiązane problemy