Python Eval сделать модуль datetime доступным - PullRequest
3 голосов
/ 05 февраля 2020

Я ищу способ сделать функции 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__?

1 Ответ

0 голосов
/ 05 февраля 2020

Предполагая, что вы хотите сделать то, что я думаю, вы хотите сделать:

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()' для выхода из вашей программы или намного, намного хуже.

...