Pregunta

Estoy escribiendo un programa para calcular el volumen de un sólido de rotación. El primer paso de este es calcular una integral. Estoy usando scipy.integrate para esto, pero no puedo averiguar la mejor manera de tener una ecuación (como entrada x=x**2 en la línea de comandos que estaba planeando originalmente en la adición de un argumento 'con respecto a: x | y' y después. teniendo la función como lambda. Por desgracia, argparse no tomará lambda como un tipo de argumento, y tratando de utilizar una cadena para construir un lambda (f = lambda x: args.equation) simplemente devuelve una cadena (comprensiblemente realmente).

Esto es lo que tengo hasta ahora:

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)

Se apreciará Cualquier consejo gracias

¿Fue útil?

Solución

Si no hay absolutamente ninguna preocupación acerca de los riesgos de seguridad de dejar correr el usuario arbitrario código Python , a continuación, puede utilizar eval para crear un objeto invocable:

volume(eval('lambda x: %s' % args.equation), args.a, args.b)

Otros consejos

debería ser capaz de utilizar eval() en la cadena que recibe de su argumentos:

>>> f = eval("lambda x: x**2")
>>> f(5)
25
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top