【发布时间】:2020-05-21 12:47:48
【问题描述】:
我正在寻找一种方法来使 datetime 的函数在 eval 表达式中可用。这将是最小的工作代码
import datetime
input_string = 'from_{today:%m-%d}_to_{yesterday:%m-%d}'
input_dict = {
'today': eval('datetime.datetime.today()', {'datetime': datetime}, {}),
'yesterday': eval('datetime.datetime.today()-datetime.timedelta(days=1)', {'datetime': datetime}, {})
}
print(input_string.format(**input_dict))
但这并不妨碍 eval 函数执行__builtins__ 的方法。如何阻止它访问__builtins__?
【问题讨论】:
-
你的意思是把#放在
eval_dict = {format_key: eval(之前还是错字? -
即使你完成了这项工作,一个有经验的用户几乎肯定能够突破你的沙箱并造成麻烦。如果这是真实的(不是玩具项目),那么您可能应该编写一个适当的解析器而不是使用
eval -
我认为您只需要一个 function 接受输入字符串,然后根据需要计算
today和yesterday的值以传递给输入字符串的 @987654328 @ 方法。不需要eval。 -
没错。然而,今天和昨天只是示例日期时间。用户可以灵活地访问整个日期时间模块,包括通过 timedelta 进行计算。
-
是的,这是个坏主意。
eval是全有或全无;它评估一个有效的 Python 表达式,无论该表达式包含什么。您不能将其限制为您期望用户输入的表达式。