2016-03-06 3 views
0

Я пишу API-интерфейс python, и у меня есть одна проблема. У меня есть 3 различные функции:один декоратор для 3-х различных функций

func1()  -> return only text 
func2(name) -> return text only but takes parameter 
func3(name) -> this function create a file "name".txt 

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

Теперь у меня есть что-то вроде этого:

def log(func): 
    def wrapper(name): 
     func(name) 
     log = ('write something here') 
     f = open('log.txt', 'a+') 
     f.write(log + "\n") 
     f.close(name) 
    return wrapper 
+0

Вы должны использовать произвольные аргументы - смотри, например, http://stackoverflow.com/q/36901/3001761. Затем просто «возвращай» все, что возвращает «func», функции, которые явно не возвращают ничего, возвращают «Нет». – jonrsharpe

ответ

2

Ваша обертка должна принимать произвольное число аргументов, с синтаксисом *args и **kwargs захватить как позиционные и именованные аргументы. Убедитесь в том, чтобы вернуть то, что завернутые функция возвращает:

def log(func): 
    def wrapper(*args, **kwargs): 
     result = func(*args, **kwargs) 
     log = ('write something here') 
     with open('log.txt', 'a+') as f: 
      f.write(log + "\n") 
     return result 
    return wrapper 

Вы, вероятно, хотите добавить в @functools.wraps decorator; это копии через какой-либо документации и других метаданных из исходной завернутые функции к новой обертке:

from functools import wraps 

def log(func): 
    @wraps(func) 
    def wrapper(*args, **kwargs): 
     result = func(*args, **kwargs) 
     log = ('write something here') 
     with open('log.txt', 'a+') as f: 
      f.write(log + "\n") 
     return result 
    return wrapper 

И последнее, но не в последнюю очередь, а не повторного открытия файл самостоятельно журнала, посмотрите на logging module для обработки лог-файлов для вас ,

+0

Спасибо, я попробую, похоже на ответ, который мне нужен. ;) – eMZet

1
def log(func): 
    def wrapper(*args, **kwds): 
     log = func(*args, **kwds) 
     f = open('log.txt', 'a+') 
     f.write(log + "\n") 
     f.close() 
    return wrapper 

@log 
def func1(): 
    return "Called function 1" 

@log 
def func2(name): 
    return "Called function 2 with " + name 

@log 
def func3(name): 
    f = open('name.txt', 'a+') 
    f.write(name + " from func3\n") 
    f.close() 
    return "Called function 3 with " + name 

def main(): 
    func1() 
    func2("func2") 
    func3("func3") 

if __name__ == '__main__': 
    main() 

Log.txt становится:

Called function 1 
Called function 2 with func2 
Called function 3 with func3 
Смежные вопросы