Форум сайта python.su
0
Здравствуйте.
Возник вопрос.
А как устроена область видимости декоратора?
var = 'glob' def decor(func): var = 'in_func decor' def wripper(): var = 'in_func wripper' return func() return wripper @decor def xxx(): print var xxx()
Отредактировано soln (Март 25, 2013 16:49:24)
Офлайн
43
solnтак же как у функции
А как устроена область видимости декоратора?
def xxx(): print var xxx = decor(xxx)
Отредактировано sergeek (Март 25, 2013 17:16:36)
Офлайн
0
sergeek
так же как у функции
In [24]: def decor(): ....: var = 'in_func decor' ....: def wripper(): ....: var = 'in_func wripper' ....: print var ....: wripper() In [25]: decor() in_func wripper In [26]: var = 'glob' In [27]: decor() in_func wripper
sergeek
посчитай вручную и поймешь
Отредактировано soln (Март 26, 2013 11:53:27)
Офлайн
88
Локальные объявления перекрывают глобальные.
Оборачиваемая функция передается в декоратор как параметр - почему она должна при этом видеть объявления декоратора?
Офлайн
0
Кажется я понял. Спасибо.
Декоратору передается объект функции с уже запакованной областью видимости.
var = 'glob' def decor(func): var = 'in_func decor' def wripper(): var = 'in_func wripper' print func.__globals__['var'] # return func() return wripper #xxx = decor(xxx) @decor def xxx(): print var print xxx.__globals__['var'] xxx()
var = 'glob' def decor(func): var = 'in_func decor' def wripper(): var = 'in_func wripper' func.__globals__['var'] = var return func() return wripper #xxx = decor(xxx) @decor def xxx(): print var print xxx.__globals__['var'] xxx()
Отредактировано soln (Март 26, 2013 13:15:11)
Офлайн
88
Кроме того, что среда питона использует декораторы как декораторы, в остальном они обычные функции.
Офлайн
88
Даже вот так работает:
class decor(): def __call__(self, func): def wrapper(): var = 'in_func wrapper' print var return func() return wrapper newc=decor() d=newc @d def myf(): print 123 myf()
Офлайн
-36
Вставляю пост выше в интерпретатор питона 2.7 - матерится. Что такое?
Офлайн
88
У меня всё работает.
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
in_func wrapper
123
Офлайн