Используйте python eval() в вызовах методов
Я использовал eval()
раньше, но я пытаюсь использовать его в вызове метода, и он не работает.
if level == 'info':
logging.info(
f"Date:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}, Ran with args: {args}, and kwargs: {kwargs}"
)
elif level == 'warning':
logging.warning(
f"Date:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}, Ran with args: {args}, and kwargs: {kwargs}"
)
elif level == 'error':
logging.error(
f"Date:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}, Ran with args: {args}, and kwargs: {kwargs}"
)
elif level == 'critical':
logging.critical(
f"Date:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}, Ran with args: {args}, and kwargs: {kwargs}"
)
Как сделать меньше кода, используя что-то вроде:
level == 'info':
logging.eval(level)(
f"Date:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}, Ran with args: {args}, and kwargs: {kwargs}"
)
Я действительно думал, что это последнее сработает:
level = 'info'
log = f"{logging}.{eval(level)}"
eval(log)(f"Date:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}, Ran with args: {args}, and kwargs: {kwargs}")
Кто-нибудь знает способ заставить это работать?
Использование eval
обычно является плохой идеей. Вы можете использовать getattr
, например:
getattr(logging, level)(
f"Date:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}, Ran with args: {args}, and kwargs: {kwargs}"
)
Таким образом, вы не выполняете произвольный код, основанный на том, что содержит level
, а просто пытаетесь получить атрибут с таким именем из logging
(и немедленно поднимаете вопрос AttributeError
, если он не действителен).
FWIW, я бы реализовал это наоборот - пусть этот метод return
создает строку логирования, а вызывающая сторона передает ее logging.whatever
. Вызывающая сторона уже должна знать, какую конкретную функцию logging
она вызывает; если вы просто заставите ее вызвать фактическую функцию, а не передавать ее имя в виде строкового литерала, будет легче отловить опечатки и т.д. с помощью статического анализа.
Вы можете сделать вот так, и это просто, если я понимаю :-
error = {
'info':logging.info,
'warning':logging.warning,
'error':logging.error,
'critical':logging.critical,
}
massage = f"Date:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}, Ran with args: {args}, and kwargs: {kwargs}"
error.get(level)(massage)
Почему бы просто не использовать функцию logging.log
из logging?
loggging.log(level, msg)
См. logging