كيف يمكنني تمرير جميع المعلمات إلى ديكور؟
سؤال
حاولت تتبع تنفيذ بعض الطرق باستخدام ديكور. هنا رمز الديكور:
def trace(func):
def ofunc(*args):
func_name = func.__name__
xargs = args
print "entering %s with args %s" % (func_name,xargs)
ret_val = func(args)
print "return value %s" % ret_val
print "exiting %s" % (func_name)
return ofunc
الشيء هو ، إذا حاولت تطبيق هذا الديكور على الأساليب ، فإن المعلمة الذاتية لا يتم إرسالها. هل يمكن أن تخبرني لماذا ، وكيف يمكنني إصلاح ذلك؟
المحلول
هذا الخط غير صحيح:
ret_val = func(args)
أنت تنسى توسيع قائمة الوسيطة عندما تمر بها. يجب أن يكون:
ret_val = func(*args)
عينة الإخراج مع هذا التعديل في المكان:
>>> class Test2:
... @trace
... def test3(self, a, b):
... pass
...
>>> t = Test2()
>>> t.test3(1,2)
entering test3 with args (<__main__.Test2 instance at 0x7ff2b42c>, 1, 2)
return value None
exiting test3
>>>
إذا قمت بتوسيع ديكورك من أي وقت مضى لاتخاذ وسيطات الكلمات الرئيسية أيضًا ، ستحتاج أيضًا إلى توسيعها بشكل مناسب عند تمريرها ، باستخدامها **
.
لا تنتمي إلى StackOverflow