Как взять функцию в качестве аргумента? (Python) - PullRequest
3 голосов
/ 08 декабря 2010

Я пишу программу для расчета объема тела вращения.Первым шагом является вычисление интеграла.Я использую scipy.integrate для этого, но я не могу найти лучший способ получить уравнение (например, x=x**2, вводимое в командной строке. Я изначально планировал добавить аргумент «относительно: x |y ', а затем принимает функцию как лямбду. К сожалению, argparse не будет принимать лямбду в качестве типа аргумента, а попытка использовать строку для создания лямбды (f = lambda x: args.equation) просто возвращает строку (понятно, действительно).

Вот что я получил до сих пор:

import sys
import argparse
import math
from scipy import integrate

parser = argparse.ArgumentParser(description='Find the volume of the solid of rotation defined')
parser.add_argument('equation', help='continous function')
parser.add_argument('a', type=float, help='bound \'a\'')
parser.add_argument('b', type=float, help='bound \'b\'')
parser.add_argument('-axis', metavar='x|y', help='axis of revolution')
args = parser.parse_args()

def volume(func, a, b, axis=None):
  integral = integrate.quad(func, a, b)
  return scipy.py * integral

print volume(args.equation, args.a, args.b)

Любой совет будет оценен спасибо

Ответы [ 2 ]

6 голосов
/ 08 декабря 2010

Если нет абсолютно никаких опасений по поводу угроз безопасности, связанных с тем, что пользователь может запускать произвольный код Python , тогда вы можете использовать eval для создания вызываемого объекта:

volume(eval('lambda x: %s' % args.equation), args.a, args.b)
2 голосов
/ 08 декабря 2010

Вы должны иметь возможность использовать eval() в строке, полученной из аргументов:

>>> f = eval("lambda x: x**2")
>>> f(5)
25
...