在方法调用中使用 python eval()

Use python eval() in method calls

我以前使用过 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 日志字符串,并让 caller 将它提供给 logging.whatever.调用者已经需要知道它正在调用哪个特定的 logging 函数;如果您只是让它调用实际函数而不是将其名称作为字符串文字传递,则通过静态分析更容易捕获 typos/etc。

你可以这样做,如果我理解的话,它很简单:-

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 函数?

loggging.log(level, msg)

logging