在方法调用中使用 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)
我以前使用过 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)