Парсинг уравнения в Python

Используйте imagemagick через node.js на Lambda. Многие люди сделали это. Вот хороший пример: https://tech.mybuilder.com/memes-as-a-service-using-lambda-serverless-and-imagemagick/

Лямбда-функция выглядит как это:

'use strict';

const gm = require('gm').subClass({ imageMagick: true });
const fs = require('fs');

const { IMAGES_DIR, TEXT_SIZE, TEXT_PADDING } = process.env;

const parseText = text => (text || '').toUpperCase();
const getImages = () => fs.readdirSync(IMAGES_DIR);
const parseImage = image => getImages().find(file => file.indexOf(image) === 0);
const random = arr => arr[Math.floor(Math.random() * arr.length)];
const randomImage = () => random(getImages());

module.exports.meme = (event, context, callback) => {
  const input = event.queryStringParameters || {};

  const top = parseText(input.top);
  const bottom = parseText(input.bottom);
  const image = parseImage(input.image) || randomImage();

  const meme = gm(`${IMAGES_DIR}${image}`);

  meme.size(function (err, { height }) {
    meme
      .font('./impact.ttf', TEXT_SIZE)
      .fill('white')
      .stroke('black', 2)
      .drawText(0, -(height / 2 - TEXT_PADDING), top, 'center')
      .drawText(0, height / 2 - TEXT_PADDING, bottom, 'center')
      .toBuffer(function (err, buffer) {
        callback(null, {
          statusCode: 200,
          headers: { 'Content-Type': 'image/jpeg' },
          body: buffer.toString('base64'),
          isBase64Encoded: true,
        });
      });
  });
};

38
задан bummi 1 December 2013 в 13:12
поделиться

6 ответов

Собственный внутренний компилятор Python может проанализировать это при использовании нотации Python.

, Если Ваше изменение нотация немного, Вы будете более счастливыми.

import compiler
eq= "sin(x)*x**2"
ast= compiler.parse( eq )

Вы получаете абстрактное синтаксическое дерево, с которым можно работать.

46
ответ дан S.Lott 27 November 2019 в 03:14
поделиться
 f = parser.parse('sin(x)*x^2').to_pyfunc()

, Где parser мог быть определен с помощью СГИБА, pyparsing, встроенного токенизатора, синтаксического анализатора, ast.

не используют eval на вводе данных пользователем.

14
ответ дан jfs 27 November 2019 в 03:14
поделиться

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

0
ответ дан SilentGhost 27 November 2019 в 03:14
поделиться

Подчеркнуть J.F. Совет Sebastian, 'оценка' и даже решения 'для компилятора' могут быть открыты для тонких дыр в системе безопасности. Насколько защищенный вход? С 'компилятором' можно, по крайней мере, отфильтровать вещи как getattr поиски от AST, но я нашел, что легче использовать СГИБ или pyparsing для этого вида вещи, чем он должен защитить результат освобождения справки Python.

кроме того, 'компилятор' неуклюж и тверд использовать. Это удержано от использования и удалено в 3,0. Необходимо использовать 'ast' модуль (добавленный в 2,6, доступный в 2,5 как '_ast').

2
ответ дан Andrew Dalke 27 November 2019 в 03:14
поделиться

По согласованию с вартеком. Я бы использовал SymPy - в частности, функция lambdify должна делать именно то, что вы хотите.

См.: http://showmedo.com/videotutorials/video?name=7200080&fromSeriesID=720

для очень хорошего объяснения этого.

С наилучшими пожеланиями,

1
ответ дан 27 November 2019 в 03:14
поделиться

pyparsing может делать то, что вы хотите ( http://pyparsing.wikispaces.com/ ), особенно если строки взяты из ненадежного источник.

См. Также http://pyparsing.wikispaces.com/file/view/fourFn.py , где есть довольно полнофункциональный калькулятор, построенный с его помощью.

7
ответ дан 27 November 2019 в 03:14
поделиться
Другие вопросы по тегам:

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