2012-09-10 15 views
5

क्या यह जांचने का एक अच्छा तरीका है कि ऑब्जेक्ट ओ एक अंतर्निहित पायथन फ़ंक्शन है या नहीं?पायथन - परीक्षण करें कि ऑब्जेक्ट एक बिल्टिन फ़ंक्शन है

मैं जानता हूँ कि मैं उदाहरण

type(o) == type(pow) 

क्योंकि प्रकार (पाउ) 'builtin_function_or_method' है के लिए उपयोग कर सकते हैं।

लेकिन क्या कुछ अच्छा तरीका है?

उत्तर

9

प्रकार मॉड्यूल:

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

हालांकि, अगर आप हुड के नीचे देखें, तो आप यह है कि तुम अब क्या कर रहे हैं से अलग नहीं है मिल जाएगा।

तो, आपके मामले में,

isinstance(o, types.BuiltinFunctionType) 
+0

के रूप में @ iMom0 अपने जवाब में कहा - आप के बजाय 'प्रकार का उपयोग करने का' isinstance (एक्स, वाई) का उपयोग कर सकते '(x) == प्रकार (z)', मुझे लगता है कि इसे और अधिक pythonic है :) – slallum

+0

आप ठीक है, मैं क्या सोच रहा था। –

+1

यह आपको नहीं बताता है कि कोई फ़ंक्शन बनाया गया है, यह आपको बताता है कि यह एक मूल रूप से संकलित सी फ़ंक्शन है या नहीं। सी एक्सटेंशन के साथ तीसरे पक्ष के मॉड्यूल भी इस प्रकार के रूप में अपने कार्यों की रिपोर्ट करेंगे। –

3

का उपयोग इस प्रयास करें:

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

आप भी CPython में

import __builtin__ 
o in __builtin__.__dict__.values() 

या, कर सकते हैं:

o in __builtins__.__dict__.values() 

लेकिन ध्यान दें कि आप यहां एक कार्यान्वयन विवरण पर भरोसा करते हैं।


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

यह आप "निर्मित" क्या मतलब है निर्भर करता है।

__builtins__

का उपयोग करके आप देखना होगा कि आपकी समारोह अजगर दुभाषिया में निर्मित कार्यों में से एक का उपयोग कर सकते है चाहते हैं

>>> pow in __builtins__.__dict__.values() 
True 
>>> __builtins__.__dict__['pow'] 
<built-in function pow> 

अजगर दुभाषिया बनाया की एक संख्या है - स्थिरांक, कार्य, प्रकार, और अपवाद, जो __builtins__.__dict__ शब्दकोश में निहित हैं।

BuiltinFunctionType

के उपयोग से आपका समारोह प्रकार का है, तो जाँच करने के लिए BuiltinFunctionType आप types मॉड्यूल

>>> import types 
>>> isinstance(pow, types.BuiltinFunctionType) 
True 

inspect

या का उपयोग उपयोग कर सकते हैं चाहते हैं तो दूसरी तरफ हैं inspect.isbuiltin (के आसपास बस एक रैपर)

>>> import inspect 
>>> inspect.isbuiltin(pow) 
True 

नोट का मतलब है कि शब्द "निर्मित" BuiltinFunctionType में "सी में लिखा"।

निम्न उदाहरण पर विचार करें:

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

factorial समारोह प्रकार BuiltinFunctionType की है लेकिन यह दुभाषिया

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

इसका कारण यह है पायथन में math मॉड्यूल के होते हैं में एक builtin समारोह नहीं है सी गणित पुस्तकालय कार्यों के आसपास रैपर।

BuiltinFunctionType का पता लगाने में सक्षम होने के कारण उपयोगी है क्योंकि पायथन में लिखे गए कार्यों के लिए स्रोत स्रोतों को खोलने के बिना स्रोत कोड का निरीक्षण कर सकते हैं।

>>> 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() 
संबंधित मुद्दे