2009-08-11 7 views
26

कोई जांच कैसे कर सकता है कि एक चर एक उदाहरण विधि है या नहीं? मैं अजगर 2.5 का उपयोग कर रहा हूँ।पायथन: मान लें कि वेरिएबल उदाहरण विधि है?

कुछ इस तरह:

class Test: 
    def method(self): 
     pass 

assert is_instance_method(Test().method) 
+16

यहां पूछने में क्या गलत है? – quano

+3

स्रोत पढ़ना कोई मदद नहीं है - संभवतः वह कुछ कोड लिख रहा है जिसे रनटाइम पर जवाब जानने की आवश्यकता है। उदाहरण के लिए, किसी वस्तु पर सभी attrs के माध्यम से संभवतः पुनरावृत्ति। –

उत्तर

41

inspect.ismethod वह है जो आप जानना चाहते हैं कि आपके पास निश्चित रूप से कोई तरीका है, बल्कि आप जो कुछ भी कॉल कर सकते हैं उसके बजाए।

import inspect 

def foo(): pass 

class Test(object): 
    def method(self): pass 

print inspect.ismethod(foo) # False 
print inspect.ismethod(Test) # False 
print inspect.ismethod(Test.method) # True 
print inspect.ismethod(Test().method) # True 

print callable(foo) # True 
print callable(Test) # True 
print callable(Test.method) # True 
print callable(Test().method) # True 

callable सच है अगर तर्क तर्क एक विधि, (lambda रों सहित) एक समारोह, __call__ या एक वर्ग के साथ एक उदाहरण है यदि।

विधियों के कार्यों की तुलना में अलग-अलग गुण होते हैं (जैसे im_class और im_self)। तो आप

assert inspect.ismethod(Test().method) 
+5

+1, निरीक्षण अच्छा है (और वह "defiantly" टाइपो वास्तव में अच्छी तरह से पढ़ता है ;-)। –

+5

http://www.d-e-f-i-n-i-t-e-l-y.com/ :-) –

+0

पायथन 3.5 का उपयोग करके, 'inspect.ismethod (test.method)' झूठा रिटर्न देता है। – Devin

8

आप अगर यह ठीक एक उदाहरण विधि निम्नलिखित फ़ंक्शन का उपयोग है जानना चाहते हैं। (यह तरीकों कि एक metaclass पर परिभाषित और एक वर्ग वर्ग तरीकों पर पहुंचा जा सकता है समझता है, हालांकि वे भी उदाहरण तरीकों पर विचार किया जा सकता है)

import types 
def is_instance_method(obj): 
    """Checks if an object is a bound method on an instance.""" 
    if not isinstance(obj, types.MethodType): 
     return False # Not a method 
    if obj.im_self is None: 
     return False # Method is not bound 
    if issubclass(obj.im_class, type) or obj.im_class is types.ClassType: 
     return False # Method is a classmethod 
    return True 

आमतौर पर उस के लिए जाँच एक बुरा विचार है। किसी भी कॉल करने योग्य() विधियों के साथ एक दूसरे के साथ उपयोग करने में सक्षम होने के लिए यह अधिक लचीला है।