Найти - Пользователи
Полная версия: Про декораторы
Начало » Python для новичков » Про декораторы
1
FishHook
Если некая функция foo() задекорирована функцией bar()

@bar
def foo()
do_something

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

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

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

def A(x):
return x()

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

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

B=A(B)
Мы получаем в глобальной области видимости переменную B, к которой обращаемся.
А в локальной области видимости функции A() мы имеет нашу функцию B(), переименованную в x().
PooH
FishHook
Ваш код очевиден
Ну да. Вы чего-то странного хотите. Если декоратор ваш, то можно сделать исходную функцию атрибутом декорированной. Больше в голову ничего не приходит. А можно вопрос? Зачем?
bazooka
декоратор это просто синтаксический сахар для
def foo()
do_something

foo = bar(foo)
там нет никакой магии
FishHook
Сорри, друзья, я делаю только первые потуги кодить на питоне, поэтому и хочу странного

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__

ПС: я уже понял, что нельзя :)
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
FishHook
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
Спасибо, это то, о чем я спрашивал
bazooka
>>> 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
не всегда
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB