هل ديكور في بيثون تمامًا مثل استدعاء وظيفة على وظيفة؟
-
28-09-2019 - |
سؤال
اعتقدت أن القيام بذلك
@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__'
لا تنتمي إلى StackOverflow