كيف يمكنني تمرير جميع المعلمات إلى ديكور؟

StackOverflow https://stackoverflow.com/questions/625786

  •  05-07-2019
  •  | 
  •  

سؤال

حاولت تتبع تنفيذ بعض الطرق باستخدام ديكور. هنا رمز الديكور:

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
>>> 

إذا قمت بتوسيع ديكورك من أي وقت مضى لاتخاذ وسيطات الكلمات الرئيسية أيضًا ، ستحتاج أيضًا إلى توسيعها بشكل مناسب عند تمريرها ، باستخدامها **.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top