python كوبرا كيفية استخدام وظيفة رد الاتصال في الثعبان؟




كوبرا حقيقية (2)

إذا قمت بتنفيذ ذلك، فمن السهل بسيط.

member_of() بإرجاع طريقة التحقق من الكائن. لديك لتنفيذ للحصول على نتيجة عن طريق القيام بشيء مثل إذا member_of('admin')() : أو،

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

للقيام بمهمتك.

وأتساءل كيفية استخدام بشكل صحيح بيثون 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()

هل سيؤدي هذا إلى تنفيذ رد المطالبة والتحقق من مجموعة المشرفين؟ أو سوف معرفة ما إذا كانت قيمة "member_of" هي تعريف الدالة وتعريف الدالة على الأرجح دائما قيمة "ترو" (أو ربما قيمة فالس) ولكن كلاهما خطأ، لأنه يحتاج إلى تنفيذ

يمكنك تنوير لي على هذا؟ كيف يمكنني التأكد من تنفيذ رد الاتصال؟ كيف يمكنني تمريره كما هو عليه؟


في الثعبان، كما هو الحال في العديد من اللغات الأخرى، متغير يمكن أن تحتوي أيضا على وظيفة ويمكنك تمريرها حول مثل المتغيرات الأخرى التي تحتوي على سبيل المثال الأرقام أو السلاسل.

الدالة 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
  ...  

في البداية قد يبدو غريبا قليلا في الثعبان أن يكون مزدوج ()() ، ولكن إذا كنت تفكر في ذلك لفترة من الوقت من المنطقي.





functional-programming