15

मुझे आश्चर्य है कि पाइथन 2.7 कॉलबैक फ़ंक्शंस का सही तरीके से उपयोग कैसे करें।पायथन में कॉलबैक फ़ंक्शन का उपयोग कैसे करें?

मेरे पास मेरे कोड में चेरीपी ऑथ उदाहरणों से कुछ कॉलबैक फ़ंक्शन हैं।

(ये कॉलबैक उपयोगकर्ता एक समूह में किया जा रहा है या नहीं में लॉग इन के आधार पर, एक समारोह है कि सही है या गलत करने के लिए मूल्यांकन कर सकते हैं वापसी।)

मुझे आश्चर्य है अगर एक कॉलबैक मार डाला जाता है या अगर मैं एक टुकड़ा लिख ​​नहीं इस तरह कोड का:

पुस्तकालय से परिभाषा दी गई है:

def member_of(groupname): 
    def check(): 
     if groupname == 'admin': 
      if cherrypy.request.login == 'joe': 
      return True 
      if cherrypy.request.login == 'toni': 
      return True 
      return False 
     return False 
     # .... (other groups checked in the same way) 
    return check # returns a callback function from my understanding? 

मैं कैसे लागू करते हैं और मेरी कोड में कॉलबैक पर अमल कर सकते हैं?

तो मैं इसे इस तरह से रख:

if member_of('admin'): 
    do_something() 
    else: 
    do_something_else() 

इस calllback निष्पादित और व्यवस्थापक समूह के लिए जाँच करेगा? या यह पता लगाएगा कि "member_of" का मान फ़ंक्शन परिभाषा है और फ़ंक्शन परिभाषा शायद हमेशा "सत्य" मान (या शायद एक गलत मान) है लेकिन दोनों गलत हैं, क्योंकि इसे

निष्पादित करने की आवश्यकता है क्या आप मुझे इस पर प्रकाश डाल सकते हैं? मैं कैसे सुनिश्चित कर सकता हूं कि कॉलबैक निष्पादित किया गया है? मैं इसे कैसे चारों ओर पास कर सकता हूं?

+0

निष्पादित करने का प्रयास किया? – specialscope

उत्तर

14

पाइथन में, कई अन्य भाषाओं की तरह, एक चर में एक फ़ंक्शन भी हो सकता है और आप उन्हें अन्य चरों की तरह पास कर सकते हैं जिनमें उदा। संख्या या तार।

चेरीपी का member_of फ़ंक्शन स्वयं आपके उदाहरण में एक फ़ंक्शन लौटाता है।

मैं सरल चरणों में यह समझा रहा हूँ:

आप member_of() लिखते हैं तो यह समारोह member_of() इस मामले में नाम check साथ समारोह है, जिनमें से परिणाम देता है।

cb_function = member_of('admin') 

इस बिंदु चर cb_function पर समारोह member_of बुला का परिणाम रखती है, और अंतिम पंक्ति में member_of रिटर्न check, जो समारोह member_of एक और समारोह के रूप में भीतर परिभाषित किया गया था!

आपको पहले परिणाम को फिर से कॉल करना होगा, क्योंकि आप इसे स्थानीय फ़ंक्शन के रूप में लगभग उसी तरह से इलाज कर सकते हैं, जिसे आपने वर्तमान संदर्भ में परिभाषित किया है, अंतिम परिणाम प्राप्त करने के लिए, कुछ ऐसा करने से :

my_result = cb_function() 

और फिर आप जारी रखेंगे और परिणाम का उपयोग करेंगे।उदाहरण के लिए आप अपने बूलियन मान जांच कर सकता है:

if my_result: 
    # do something 
    ... 

एक साथ ऊपर से 3 चरणों लिखा जा सकता है कम:

cb_function = member_of('admin') 
    if cb_function(): 
    # do something 
    ... 

या भी कम:

if member_of('admin')(): 
    # do something 
    ... 

पहले यह प्रकट हो सकता है पाइथन में थोड़ा अजीब ()() है, लेकिन यदि आप थोड़ी देर के लिए इसके बारे में सोचते हैं तो यह समझ में आता है।

3

यदि आप इसे निष्पादित करते हैं, तो यह सादा सरल है।

member_of() विधि ऑब्जेक्ट चेक वापस कर देगा। आप की तरह member_of('admin')() अगर कुछ कर रही द्वारा परिणाम प्राप्त करने पर अमल करने के लिए है: या,

k=member_of('admin') 
if k(): 

अपने कार्य करने के लिए।

संबंधित मुद्दे