اذهب إلى المحتوى
  • 0

تمرير مدخلات إلى decorator في بايثون

Fahmy Mostafa

السؤال

تعلمت كيف أقوم بعمل decorator في بايثون ولكن الآن تواجهني مشكلة وهي أني لا أستطيع تمرير مدخلات إلى الـ decorator، على سبيل المثال لدي دالة كالتالي مع decorator:

@decorator_with_args(arg)
def foo(*args, **kwargs):
    pass

كيف يمكنني القيام بهذا الأمر؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

لفهم decorators مع المُدخلات انظر للمثال الآتي

@decorator
def foo(*args, **kwargs):
    pass

يترجم إلى التالي

foo = decorator(foo)

لذلك إذا كان للdecorator مُدخلات

@decorator_with_args(arg)
def foo(*args, **kwargs):
    pass

يترجم إلى الآتي

foo = decorator_with_args(arg)(foo)

decorator_with_args هي دالة تقبل مُدخلات مخصصة وتقوم بإرجاع decorator الفعلي (الذي سيتم تطبيقه على دالة decorator).

حيلة بسيطة لتسهيل استخدام decorator

from functools import partial
# إنشاء 
# decorator
# مزيف
def _pseudo_decor(fun, argument):
    def ret_fun(*args, **kwargs):
        # اعمل أي شيء هنا ، على سبيل المثال
        print ("decorator arg is %s" % str(argument))
        return fun(*args, **kwargs)
    return ret_fun

real_decorator = partial(_pseudo_decor, argument=arg)

# decorator
# الحقيقي
@real_decorator
def foo(*args, **kwargs):
    pass

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

حسب ما فهمت أنك تريد إنشاء decorator نمرر له arguments ويمكننا عمل ذلك من خلال إنشاء دالة تقبل ال arguments وننشأ دالة أخرى بداخلها تقبل دالة وترجع دالة أخرى أو (بمعنى آخر يعتبر ال decorator ) ثم بداخلها ننشاً الدالة wrapper

لذلك سيصبح الكود مشابه للتالي

def decorator_maker(argument):
    def decorator(function):  # decorator هنا يعتبر هذا هو ال 
        def wrapper(*args, **kwargs):
            some_stuff()
            function_with_argument(argument)
            result = function(*args, **kwargs)
            return result
        return wrapper
    return decorator #argument يقبل ال  decorator الأن نرجع 
رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...