Используйте 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

Вернуться на верх