هل ديكور في بيثون تمامًا مثل استدعاء وظيفة على وظيفة؟

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

سؤال

اعتقدت أن القيام بذلك

@f
def g():
   print 'hello'

هو بالضبط نفس الشيء

def g():
   print 'hello'
g=f(g)

لكن ، كان لدي هذا الرمز ، الذي يستخدم contextlib.contextManager:

@contextlib.contextmanager
def f():
    print 1
    yield
    print 2
with f:
    print 3

الذي يعمل ويحقق العائد 1 3 2

وعندما حاولت تغييره إلى

def f():
    print 1
    yield
    print 2
f=contextlib.contextmanager(f)
with f:
    print 3

انا حصلت AttributeError: 'function' object has no attribute '__exit__'

ماذا ينقصني؟ هل هناك بعض السحر الأسود على وجه التحديد في ContextLib.ContextManager ، أو هل أسيء فهم كيفية عمل الديكور بشكل عام؟

هل كانت مفيدة؟

المحلول

نعم ، الديكور هو نفسه تمامًا مثل استدعاء وظيفة وتعيين القيمة التي تم إرجاعها

في هذه الحالة ، يأتي الخطأ لأنك لا تتصل بوظيفة الاتصال ، لذلك سيكون الرمز الصحيح

def f():
    print 1
    yield
    print 2

f=contextlib.contextmanager(f)
with f():
    print 3

كما أنني لست متأكدًا مما إذا كنت قد اختبرت رمزًا ، لأن رمز الديكور الذي قدمته سيفشل بسبب نفس السبب

@contextlib.contextmanager
def f():
    print 1
    yield
    print 2
with f:
    print 3

خطأ:

    with f:
AttributeError: 'function' object has no attribute '__exit__'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top