Fahmy Mostafa نشر 9 يوليو 2021 أرسل تقرير نشر 9 يوليو 2021 تعلمت كيف أقوم بعمل decorator في بايثون ولكن الآن تواجهني مشكلة وهي أني لا أستطيع تمرير مدخلات إلى الـ decorator، على سبيل المثال لدي دالة كالتالي مع decorator: @decorator_with_args(arg) def foo(*args, **kwargs): pass كيف يمكنني القيام بهذا الأمر؟ 2 اقتباس
0 عبدالباسط ابراهيم نشر 9 يوليو 2021 أرسل تقرير نشر 9 يوليو 2021 حسب ما فهمت أنك تريد إنشاء 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 الأن نرجع 1 اقتباس
1 عبدالله عبدالرحمن11 نشر 9 يوليو 2021 أرسل تقرير نشر 9 يوليو 2021 لفهم 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 1 اقتباس
السؤال
Fahmy Mostafa
تعلمت كيف أقوم بعمل decorator في بايثون ولكن الآن تواجهني مشكلة وهي أني لا أستطيع تمرير مدخلات إلى الـ decorator، على سبيل المثال لدي دالة كالتالي مع decorator:
كيف يمكنني القيام بهذا الأمر؟
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.