Python: Какая польза от функции eval [duplicate]

Да, вы можете просто использовать javascript для получения файла, убедившись, что вы читаете файл как URL-адрес данных. Разберите материал до base64, чтобы получить базовые 64 кодированные данные, а затем, если вы используете php или действительно какой-либо задний язык, вы можете декодировать базовые данные 64 и сохранять в файл, как показано ниже

Javascript:
var reader = new FileReader();
reader.onloadend = function ()
{
  dataToBeSent = reader.result.split("base64,")[1];
  $.post(url, {data:dataToBeSent});
}
reader.readAsDataURL(this.files[0]);


PHP:
    file_put_contents('my.pdf', base64_decode($_POST["data"]));

Конечно, вы, вероятно, захотите сделать некоторую проверку, например, проверить тип файла, с которым имеете дело, и все такое, но это идея.

24
задан Tshepang 9 March 2012 в 22:37
поделиться

13 ответов

eval и exec удобны быстро и грязно, чтобы получить некоторый исходный код динамически, возможно, немного его немного, а затем выполнить его - но они вряд ли когда-либо будут лучшим способом, особенно в производстве кода, в отличие от «быстрых и грязных» прототипов и

Например, если мне приходилось иметь дело с такими динамическими источниками Python, я бы дошел до ast - ast.literal_eval МНОГО безопаснее, чем eval (вы можете вызывать его непосредственно в строковой форме выражения, если оно одноразовое и полагается только на простые константы или сначала node = ast.parse(source), затем сохраняйте node вокруг, возможно, набросайте его подходящими посетителями, например, для поиска переменных, затем literal_eval на узле) - или, поставив узел в правильной форме и проверив его для проблем безопасности, я мог бы compile его ( приводящий к созданию объекта кода), и построим из него новый объект функции. Гораздо менее просто (за исключением того, что ast.literal_eval так же просто, как eval для простейших случаев!), Но безопаснее и предпочтительнее в коде качества продукции.

Для многих задач я видел людей (ab -) использовать exec и eval для, мощные встроенные модули Python, такие как getattr и setattr, индексирование в globals() и & amp; c, обеспечивают предпочтительные и фактически часто более простые решения. Для конкретных целей, таких как синтаксический анализ JSON, библиотечные модули, такие как json, лучше (например, см. Комментарий SilentGhost по тиннитусному ответу на этот самый вопрос). Etc и т. Д. ...

40
ответ дан Alex Martelli 21 August 2018 в 13:29
поделиться

В прошлом я использовал eval () для добавления интерфейса отладки в мое приложение. Я создал службу telnet, которая бросила вас в среду запущенного приложения. Входы выполнялись через eval (), чтобы вы могли интерактивно запускать команды Python в приложении.

5
ответ дан Andre Miller 21 August 2018 в 13:29
поделиться
  • 1
    Я сделал аналогичный сценарий COM-интерфейса для Enterprise Architect, чтобы попробовать разные запросы – Pete Kirkham 6 July 2009 в 15:33

Eval - это способ взаимодействия с интерпретатором Python изнутри программы. Вы можете передать литералы в eval и оценивать их как выражения python.

Например -

print eval("__import__('os').getcwd()")

вернет текущий рабочий каталог.

cheers

1
ответ дан Arnkrishn 21 August 2018 в 13:29
поделиться

eval () для одного предложения, в то время как exec () для нескольких.

обычно мы используем их для добавления или посещения некоторых скриптов так же, как bash shell.

, потому что из них могут запускаться некоторые байтовые скрипты в памяти, если у вас есть важные данные или сценарий, которые вы можете расшифровать и разархивировать свой «секрет», тогда сделайте все, что хотите.

0
ответ дан BBDXF 21 August 2018 в 13:29
поделиться

Я использую exec для создания системы плагинов в Python.

    try:
        exec ("from " + plugin_name + " import Plugin")
        myplugin = Plugin(module_options, config=config)
    except ImportError, message:
        fatal ("No such module " + plugin_name + \
               " (or no Plugin constructor) in my Python path: " + str(message))
    except Exception:
        fatal ("Module " + plugin_name + " cannot be loaded: " + \
               str(sys.exc_type) + ": " + str(sys.exc_value) + \
               ".\n    May be a missing or erroneous option?")

С плагином вроде:

class Plugin:

    def __init__ (self):
        pass

    def query(self, arg):
         ...

Вы сможете называть его как :

    result = myplugin.query("something")

Я не думаю, что вы можете иметь плагины в Python без exec / eval.

-1
ответ дан bortzmeyer 21 August 2018 в 13:29
поделиться
  • 1
    Это не хорошо. Вы должны использовать встроенную функцию __import__, которая вызывается оператором from ... import .... – gahooa 6 July 2009 в 22:31

Я использовал его для ввода значений переменных в основную программу:

test.py var1 = 2 var2 = True

...

var1=0
var2=False
for arg in sys.argv[1:]:
    exec(arg)

Грубый способ разрешить ключевые слова args в основной программе. Если есть лучший способ, дайте мне знать!

0
ответ дан buggy 21 August 2018 в 13:29
поделиться

Я просто наткнулся на хорошее использование eval. Я писал набор тестов для некоторого кода и создал класс Test, где каждый метод был тестом, который должен быть запущен. Я хотел, чтобы я мог запускать все методы тестирования без необходимости индивидуального вызова каждого метода. Итак, я написал что-то довольно грязное.

class Test:
    def __init__(self, *args):
       #bs

    def test1(self):
       #bs

    def test2(self):
       #bs

if __name__ == "__main__":
    import argparse
    #argparse bs
    test = Test(*bs_args)
    for func in (i for i in dir(test) if i[0] != '_' and i not in test.__dict__):
        print(eval('test.{func}()'.format(func = func)))

Динамическая оценка произвольных тестовых случаев довольно крутая. Мне просто нужно написать этот метод, и после сохранения я могу включить этот метод в свой тестовый набор. Что касается кода, я в основном просто проверяю методы, определенные в тестовом объекте, и удостоверяюсь, что они не являются «волшебными» методами или атрибутами python для объекта Test. После этого я могу предположить, что они являются методами и могут быть оценены.

0
ответ дан Casey Craig 21 August 2018 в 13:29
поделиться

Вы можете использовать eval в декораторе:

#this replaces the original printNumber with a lambda-function,
#which takes no arguments and which calls the old function with
#the number 10
@eval("lambda fun: lambda: fun(10)")
def printNumber(i: int) -> None:
    print("The number is %i", i)

#call
printNumber()

, в то время как вы не можете использовать сложные выражения, такие как

@lambda fun: lambda: fun(10)
def ...

и

@(lambda fun: lambda: fun(10))
def ...

Вы не может использовать там лямбда-выражение, потому что декоратор должен быть либо идентификатором:

@myModule.functionWithOneArg

, либо вызовом функции:

@functionReturningFunctionWithOneArg(any, "args")

Вы видите, что вызов функции eval со строкой имеет действительный синтаксис здесь, но лямбда-выражение отсутствует. (-> https://docs.python.org/3/reference/compound_stmts.html#function-definitions )

1
ответ дан cmdLP 21 August 2018 в 13:29
поделиться

Статья в Википедии eval довольно информативна и подробно описывает различные применения.

Некоторые из предложенных им применений:

  • Оценка математических выражений
  • Загрузочная компиляция
  • Сценарии (в общем, динамические языки в целом очень подходят)
  • Языковые репетиторы
15
ответ дан Noldorin 21 August 2018 в 13:29
поделиться
  • 1
    Я просмотрел эту статью и до сих пор не понимаю ... Это скорее функция вычисления, которая вычисляет арифметическое выражение! – ooboo 6 July 2009 в 15:27
  • 2
    @ooboo: eval может запускать любой код в теории (следовательно, риски безопасности указаны в статье). – Noldorin 6 July 2009 в 15:29

Вы можете использовать его, чтобы позволить пользователям вводить собственные «скрипты»: небольшие выражения (или даже небольшие функции), которые можно использовать для настройки поведения сложной системы. В этом контексте, и если вам не нужно уделять слишком много внимания последствиям безопасности (например, у вас есть образованная база пользователей), тогда eval () может быть хорошим выбором.

13
ответ дан Roberto Liffredo 21 August 2018 в 13:29
поделиться

В программе, которую я когда-то писал, у вас был входной файл, в котором вы могли указать геометрические параметры как значения, так и выражения python предыдущих значений, например:

a=10.0
b=5.0
c=math.log10(a/b)

Парсер python прочитал это входной файл и полученные окончательные данные, оценивающие значения и выражения с использованием eval ().

Я не утверждаю, что это хорошее программирование, но мне не нужно было запускать ядерный реактор.

4
ответ дан Stefano Borini 21 August 2018 в 13:29
поделиться

Я использую его как быстрый парсер JSON ...

r='''
{
    "glossary": {
        "title": "example glossary"
        }
}
'''

print eval(r)['glossary']['title']
1
ответ дан user 21 August 2018 в 13:29
поделиться
  • 1
    не делай этого. eval("""{"glossary": {"death" : false}}""") - & gt; NameError: name 'false' is not defined – SilentGhost 6 July 2009 в 16:08
  • 2
    @SilentGhost: это отличный момент, я использовал ваш пример в ответе на вопрос; [Д0] stackoverflow.com/questions/1083250/… – Kiv 6 July 2009 в 16:48
  • 3
    Использование анализатора real JSON будет менее опасным и более безопасным. – Mike Graham 19 March 2010 в 19:54
  • 4
    Хорошая идея в целом :), можно применить к разным вещам, но я не буду использовать ее с JSON, для этого есть инструменты. – securecurve 19 February 2013 в 11:37
  • 5
    Очень плохая идея ... – Vitalii Ponomar 24 March 2013 в 08:43

eval() обычно не очень полезен. Одна из немногих вещей, которые я использовал для этого (ну, на самом деле это был exec(), но это довольно похоже) позволял пользователю сценарию приложения, которое я написал в Python. Если бы он был написан как нечто вроде C ++, мне пришлось бы внедрить интерпретатор Python в приложение.

1
ответ дан Zifre 21 August 2018 в 13:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: