Вы не можете иметь общий декоратор, работающий, если он предполагает что-либо относительно возвращаемого значения декорированной функции - все, что вы можете здесь сделать, это записать результат (независимо от того, что это), то есть:
def log_check(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
# proper use of `logger` methods: dont build the whole string, just
# pass a format string and the matching arguments)
logging.info("%s took %s milliseconds", func.__name__, (end - start) * 1000)
# if you hope to use this decorator on anything else than
# your login function, don't assume _anything_ about what
# the decorated func might return
logging.info('func %s returned %s', func.__name__, result)
return result
# You want to return the wrapper function, not
# to call it !!!
# return wrapper()
return wrapper
При этом не следует смешивать несвязанные проблемы, например данные об эксплуатации (выполнение функции времени) и данные, относящиеся к области (что вернула функция и т. Д.).Вместо этого я бы лично занялся ведением доменных имен внутри самой функции.И я бы НИКОГДА не регистрировал конфиденциальные данные, такие как пары имя пользователя / пароль (напомните мне, чтобы я никогда не использовал одну из ваших программ, если у вас есть привычка пропускать такие вещи).