Python Eval使日期时间模块可用

问题描述 投票:3回答:1

我正在寻找一种使eval表达式中的datetime函数可用的方法。这将是最小的工作代码

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__

python datetime eval
1个回答
0
投票

假设您想做我想做的事:

import datetime
import math

user_input = input()

# set locals to a dict containing only datetime
# set globals to an empty dict  
eval(user_input, {'datetime': datetime}, dict())

如果用户输入“ datetime.date.today()”,则会得到“ datetime.date(2020,2,5)”。如果用户输入“ math.acos(0.5)”,则会得到“ NameError:名称'math'未定义”。

注:正如其他人所说,出于安全原因,我并不真正赞成这种方法。例如。用户可以输入'"datetime.date.today()" + quit()'退出程序,甚至更糟糕。

© www.soinside.com 2019 - 2024. All rights reserved.