2016-09-07 3 views
-1

Недавно я узнал об декораторах и задался вопросом, можно ли использовать их не в определении функции, а в вызове функции, как какой-то общей оболочке.вызов функции вызова python

Причина в том, что я хочу вызывать функции из модуля через пользовательский интерфейс, который выполняет повторяющиеся действия функции, и я не хочу реализовывать оболочку для каждой отдельной функции.

В принципе я хотел бы иметь что-то вроде

def a(num): 
    return num 

@double 
a(2) 

возвращающегося 4 без необходимости иметь доступ к реализации a. Или в этом случае глобальная обёртку

def mutiply(factor,function,*args,**kwargs): 
    return factor*function(*args,*kwargs) 

быть лучший выбор?

+0

я не уверен, я понимаю. Вы хотите украсить функции, которые находятся в каком-то стороннем модуле, который вы используете? –

+0

Я немного озадачен, почему вы хотите что-то украсить? –

+0

@joelgoldstick Вид. Я хочу сделать глобальную оболочку, если возможно, с помощью декораторов. – Dschoni

ответ

2

Существует очень хороший подробный раздел о декораторах в книге Марти Алчина Pro Python от Apress.

В то время как новый синтаксис стиль @decorator доступен только для использования при определении функции, вы можете использовать старый синтаксис, который делает то же самое так:

from module import myfunc 

myfunc = double_decorator(myfunc) 

x = myfunc(2) # returns 4 
1

Вы могли бы сделать что-то подобное:

def a(num): 
    return num * 1 

def double(f): 
    def wrapped(*args, **kwargs): 
     return f(*args, **kwargs) 
    return wrapped 

print(double(a)(2)) 

Это потому, что мы можем украсить функции и запускать функции с помощью функции декоратора явный, как в приведенном выше примере. Таким образом, в этом одна:

print(double(a)(2)) 

В месте a вы можете поставить любую функцию и вместо 2, арга и kwargs.

+0

Как использовать это сейчас вместе с синтаксисом @? – Dschoni

+0

В вашем случае вы не можете. Вы можете использовать синтаксис @ только для объявления функции. – turkus

+0

Это не работает для меня. Если я изменил определение 'a', чтобы вернуть num + 1, последняя строка, все еще печатает 4. – Dschoni

Смежные вопросы