Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 8, 2011 17:48:03

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Про декораторы

Если некая функция foo() задекорирована функцией bar()

@bar
def foo()
do_something

Есть ли возможность в дальнейшем коде задействовать foo() без декорации?



Офлайн

#2 Янв. 8, 2011 17:59:48

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Про декораторы

def foo()
do_something

foobar = bar(foo)
foo - чистая, foobar - декорированная



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#3 Янв. 8, 2011 18:03:34

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Про декораторы

PooH
def foo()
do_something

foobar = bar(foo)
foo - чистая, foobar - декорированная
Ваш код очевиден, я имел в виду именно декоратор, можно ли его как то “отменить”?



Офлайн

#4 Янв. 8, 2011 18:44:26

Gunjy
От:
Зарегистрирован: 2009-07-11
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Про декораторы

Можно вот так:

def A(x):
return x()

@A
def B():
return "Некое значение"

print B
Поскольку эта запись аналогично вот такой:

B=A(B)
Мы получаем в глобальной области видимости переменную B, к которой обращаемся.
А в локальной области видимости функции A() мы имеет нашу функцию B(), переименованную в x().



Офлайн

#5 Янв. 8, 2011 19:04:23

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Про декораторы

FishHook
Ваш код очевиден
Ну да. Вы чего-то странного хотите. Если декоратор ваш, то можно сделать исходную функцию атрибутом декорированной. Больше в голову ничего не приходит. А можно вопрос? Зачем?



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано (Янв. 8, 2011 19:04:45)

Офлайн

#6 Янв. 8, 2011 19:24:08

bazooka
От:
Зарегистрирован: 2009-04-12
Сообщения: 165
Репутация: +  0  -
Профиль   Отправить e-mail  

Про декораторы

декоратор это просто синтаксический сахар для

def foo()
do_something

foo = bar(foo)
там нет никакой магии



Офлайн

#7 Янв. 8, 2011 22:34:25

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Про декораторы

Сорри, друзья, я делаю только первые потуги кодить на питоне, поэтому и хочу странного

bazooka
декоратор это просто синтаксический сахар для
def foo()
do_something

foo = bar(foo)
там нет никакой магии
Дело в том, что применяя декоратор, я надеюсь получить более компактный и читаемый код.
Например, есть готовый модуль, в котором собраны методы для подключения к БД и извлечения нужных данных. В моей программе данные должны быть обработаны и представлены в виде римских чисел. Мне кажется логичным применить “силу и красоту” декораторов
@my_modul.to_Roman
def get_number(*args)
tmp= my_modul.get_number(*args)
…..
…..
тут много
…..
return somethingInteger

Но возникает вопрос, если по ходу мне понадобится somethingInteger придется писать функцию для одного случая или всю дорогу таскать за собой что-то типа
get_number(args).my_modul.to_Roman
Было бы логичным сделать как то так, там где это понадобится
get_number(args).__without_decorator__

ПС: я уже понял, что нельзя :)



Офлайн

#8 Янв. 9, 2011 01:39:24

zheromo
От:
Зарегистрирован: 2010-10-02
Сообщения: 356
Репутация: +  2  -
Профиль   Отправить e-mail  

Про декораторы

FishHook
ПС: я уже понял, что нельзя
почему же нельзя, можно :)

>>> def s(f):
... def inner(*a,**w):
... return str(f(*a,**w))
... return inner
...
>>> @s
... def f(x=1):
... return x
...
>>> f()
'1'
>>> f(19)
'19'
>>> f.func_closure[0].cell_contents()
1
>>> f.func_closure[0].cell_contents(19)
19



Офлайн

#9 Янв. 9, 2011 02:10:07

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Про декораторы

zheromo
FishHook
ПС: я уже понял, что нельзя
почему же нельзя, можно :)

>>> def s(f):
... def inner(*a,**w):
... return str(f(*a,**w))
... return inner
...
>>> @s
... def f(x=1):
... return x
...
>>> f()
'1'
>>> f(19)
'19'
>>> f.func_closure[0].cell_contents()
1
>>> f.func_closure[0].cell_contents(19)
19
Спасибо, это то, о чем я спрашивал



Офлайн

#10 Янв. 9, 2011 02:17:16

bazooka
От:
Зарегистрирован: 2009-04-12
Сообщения: 165
Репутация: +  0  -
Профиль   Отправить e-mail  

Про декораторы

>>> def s(f):
def inner(*a, **kw):
return 4
return inner

>>> @s
def f(x=1):
return x

>>> f()
4
>>> f(19)
4
>>> f.func_closure[0].cell_contents()

Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
f.func_closure[0].cell_contents()
TypeError: 'NoneType' object is not subscriptable
>>> f.func_closure[0].cell_contents(19)

Traceback (most recent call last):
File "<pyshell#15>", line 1, in <module>
f.func_closure[0].cell_contents(19)
TypeError: 'NoneType' object is not subscriptable
не всегда



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version