Да, вы можете просто использовать 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"]));
Конечно, вы, вероятно, захотите сделать некоторую проверку, например, проверить тип файла, с которым имеете дело, и все такое, но это идея.
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 и т. Д. ...
В прошлом я использовал eval () для добавления интерфейса отладки в мое приложение. Я создал службу telnet, которая бросила вас в среду запущенного приложения. Входы выполнялись через eval (), чтобы вы могли интерактивно запускать команды Python в приложении.
Eval - это способ взаимодействия с интерпретатором Python изнутри программы. Вы можете передать литералы в eval и оценивать их как выражения python.
Например -
print eval("__import__('os').getcwd()")
вернет текущий рабочий каталог.
cheers
eval () для одного предложения, в то время как exec () для нескольких.
обычно мы используем их для добавления или посещения некоторых скриптов так же, как bash shell.
, потому что из них могут запускаться некоторые байтовые скрипты в памяти, если у вас есть важные данные или сценарий, которые вы можете расшифровать и разархивировать свой «секрет», тогда сделайте все, что хотите.
Я использую 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
.
__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 в основной программе. Если есть лучший способ, дайте мне знать!
Я просто наткнулся на хорошее использование 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. После этого я могу предположить, что они являются методами и могут быть оценены.
Вы можете использовать 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 )
Статья в Википедии eval
довольно информативна и подробно описывает различные применения.
Некоторые из предложенных им применений:
eval
может запускать любой i> код в теории (следовательно, риски безопасности указаны в статье).
– Noldorin
6 July 2009 в 15:29
Вы можете использовать его, чтобы позволить пользователям вводить собственные «скрипты»: небольшие выражения (или даже небольшие функции), которые можно использовать для настройки поведения сложной системы. В этом контексте, и если вам не нужно уделять слишком много внимания последствиям безопасности (например, у вас есть образованная база пользователей), тогда eval () может быть хорошим выбором.
В программе, которую я когда-то писал, у вас был входной файл, в котором вы могли указать геометрические параметры как значения, так и выражения python предыдущих значений, например:
a=10.0
b=5.0
c=math.log10(a/b)
Парсер python прочитал это входной файл и полученные окончательные данные, оценивающие значения и выражения с использованием eval ().
Я не утверждаю, что это хорошее программирование, но мне не нужно было запускать ядерный реактор.
Я использую его как быстрый парсер JSON ...
r='''
{
"glossary": {
"title": "example glossary"
}
}
'''
print eval(r)['glossary']['title']
eval("""{"glossary": {"death" : false}}""")
- & gt; NameError: name 'false' is not defined
– SilentGhost
6 July 2009 в 16:08
eval()
обычно не очень полезен. Одна из немногих вещей, которые я использовал для этого (ну, на самом деле это был exec()
, но это довольно похоже) позволял пользователю сценарию приложения, которое я написал в Python. Если бы он был написан как нечто вроде C ++, мне пришлось бы внедрить интерпретатор Python в приложение.