logit.__call__
возвращает None
, а вы делаете myfunc1 = logit()(myfunc1)
через украшение.myfunc
теперь None
.
Насколько я понимаю, вы хотите регистрировать каждый вызов декорированной функции.В этом случае __call__
должен построить новую функцию и return
это.
Что-то вроде
def __call__(self, func):
def new_func(*args, **kwargs):
log_string = func.__name__ + " was called"
print(log_string)
# Open the logfile and append
with open(self.logfile, 'a') as opened_file:
# Now we log to the specified logfile
opened_file.write(log_string + '\n')
# Now, send a notification
self.notify()
# execute func
return func(*args, **kwargs)
return new_func
Теперь
@logit()
def myfunc1():
pass
делает
myfunc1 = logit()(myfunc1)
, т. Е. Переназначает имя myfunc1
на новую функцию, встроенную в __call__
.Эта новая функция выполняет логику логирования, а затем выполняет старый myfunc1
, который он все еще хранит под именем func
в качестве закрывающей переменной.